Spring Data JPA 使用

本文介绍如何使用Spring框架整合JPA进行数据持久化操作,包括实体类定义、业务层及持久层实现,以及Spring Data JPA的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,Spring 使用JPA


(1),实体类

@Entity
@Table(name = "ss_user")
public class User extends IdEntity {

	private String loginName;
	private String plainPassword;
	private String password;

  。。。
       //getter /setter
}

(2),业务层

@Service
public class AccountService {
	
	@Autowired
	private UserDao userDao;
	
        @Transactional
	public void saveUser(User user){
		userDao.save(user);
	}
     。。。。
}

(3),持久层实现

@Repository("userDao") 
 public class UserDaoImpl implements UserDao { 

 @PersistenceContext 
 private EntityManager em; 

 @Transactional 
   public Long saveUser(User user) { 
 em.persist(user); 
 return user.getId(); 
 } 
 } 

(4),配置文件


<!-- Jpa Entity Manager 配置 -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
		<property name="packagesToScan" value="com.blueinfo.jee.entity" />
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
				</prop>
				<prop key="net.sf.ehcache.configurationResourceName">cache/ehcache-hibernate-local.xml</prop>
				<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>

	<bean id="hibernateJpaVendorAdapter"
		class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
		<property name="database" value="POSTGRESQL" />
	</bean>

<!-- 事务管理器配置, Jpa单数据源事务 -->
	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

(5),在web中使用,假设使用springmvc:



	@Controller
public class LoginController {
	
	@Autowired
	private AccountService accountService;
@RequestMapping(value = "/login", method = RequestMethod.POST)
	public String login( User user, Model model) {
       accountService.saveUser(user);
		return "login";
	}
}

可以发现 Spring 对 JPA 的简化已经非常出色了,我们可以大致总结一下 Spring 框架对 JPA 提供的支持主要体现在如下几个方面:

  • 首先,它使得 JPA 配置变得更加灵活。JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中。该文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常灵活的配置,persistence.xml 中的信息都可以在此以属性注入的方式提供。
  • 其次,Spring 实现了部分在 EJB 容器环境下才具有的功能,比如对 @PersistenceContext、@PersistenceUnit 的容器注入支持。
  • 第三,也是最具意义的,Spring 将 EntityManager 的创建与销毁、事务管理等代码抽取出来,并由其统一管理,开发者不需要关心这些,如前面的代码所示,业务方法中只剩下操作领域对象的代码,事务管理和 EntityManager 创建、销毁的代码都不再需要开发者关心了。
2,使用Spring data jpa
Spring Data JPA 框架,主要针对的就是 Spring 唯一没有简化到的业务逻辑代码,开发者连仅剩的实现持久层业务逻辑的工作都省了,唯一要做的,就只是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成。

使用方法:
1),添加Spring data jpa 发布包,可以从spring官网:http://www.springsource.org/spring-data/jpa    下载
2)在配置文件(上文中已配置好spring jpa)中添加配置

<!-- Spring Data Jpa配置, 扫描base-package下所有继承于Repository<T,ID>的接口 -->
	<jpa:repositories base-package="com.blueinfo.jee.reposity.jpa"
		transaction-manager-ref="transactionManager"
		entity-manager-factory-ref="entityManagerFactory" />

3),修改持久层
 public interface UserDao extends Repository<User, Long> { 

 public AccountInfo save(User user); 

 // 你需要做的,仅仅是新增如下一行方法声明
 public User findByAccountId(Long userId); 
 } 

不用写具体实现,配置了 <jpa:repositories> 后,Spring 初始化容器时将会扫描 base-package 指定的包目录及其子目录,为继承 Repository 或其子接口的接口创建代理对象,并将代理对象注册为 Spring Bean,业务层便可以通过 Spring 自动封装的特性来直接使用该对象。其他代码同样使用。








### 如何使用 Spring Data JPA 进行开发 #### 创建实体类 为了使用 Spring Data JPA 开发应用程序,首先需要创建实体类。这些类映射到数据库中的。 ```java @Entity(name = "usertbl") @Getter @Setter public class Author { @Id private Integer userid; private String username; private String email; @OneToMany(mappedBy = "author", fetch = FetchType.LAZY) private Set<Book> books = new HashSet<>(); } ``` 此代码片段展示了 `Author` 类的定义[^4]。该类被标记为 `@Entity` 注解,示它是一个持久化对象,并且与为 `usertbl` 的相对应。字段 `userid`, `username` 和 `email` 映射到了相应的列上。另外,通过 `@OneToMany` 关联了一组书籍 (`Set<Book>`), 并指定了懒加载策略(`FetchType.LAZY`)。 #### 定义仓库接口 接着要定义一个继承自 `JpaRepository` 接口的仓库接口来管理实体的操作: ```java public interface AuthorRepository extends JpaRepository<Author, Integer> {} ``` 这个简单的声明就足以让 Spring 自动提供基本的 CRUD 方法以及分页功能。无需编写额外的实现逻辑就可以执行常见的数据访问操作[^1]。 #### 配置事务管理 当调用由 `AuthorRepository` 提供的方法时,默认会自动应用事务控制。对于所有的写入方法(如保存、更新或删除),都会有一个带有默认设置的 `@Transactional` 被隐式添加;而对于读取方法,则会被赋予 `readOnly=true` 属性以优化性能[^3]。 #### 执行查询 如果想要扩展内置的功能并执行更复杂的查询,可以通过在仓库接口中声明新的方法称来进行定制化的查找工作。例如: ```java public interface AuthorRepository extends JpaRepository<Author, Integer> { List<Author> findByUsername(String username); // 更多复杂条件组合... } ``` 上述例子展示了一个基于用户检索作者列的方法。Spring Data JPA 支持多种关键字用于构建动态查询达式,使得开发者不需要手动书写 JPQL 或原生 SQL 语句就能完成大部分的数据获取需求[^2]。 #### 总结 综上所述,利用 Spring Data JPA 可以为 Java 应用程序带来简洁而强大的 ORM 解决方案。无论是简单还是稍微复杂的业务场景下都能有效地简化数据层编码过程,提高开发效率的同时也保持良好的可维护性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值