给同事做的Spring data JPA培训的教程及例子

摘要: 项目中用到了 Spring data jpa 这个框架来实现持久层,但 jpa本身来说只是一个标准接口,所以还是用到了Hibernate JPA 的实现。spring data jpa 用起来非常简单,主要从下面四个方面来讲解 Spring data jpa 的使用.1. 入门,使用配置 persistence.xml 文件并结合spring bean 管理 entityManagerFactory 方式测试JPA2. 基于spirng data jpa 实现增删改查3. 基于spring data jpa 实现自定义查询4. 如果spring data jpa 不能完成的sql 采用 自定义扩展类完成。5. 在实际项目中去掉 persistence.xml 文件,完全采用配置 entityManagerFactory  来管理.

项目中用到了 Spring data jpa 这个框架来实现持久层,但 jpa本身来说只是一个标准接口,所以还是用到了Hibernate JPA 的实现。spring data jpa 用起来非常简单,主要从下面四个方面来讲解 Spring data jpa 的使用.

1. 入门,使用配置 persistence.xml 文件并结合spring bean 管理 entityManagerFactory 方式测试JPA
2. 基于spirng data jpa 实现增删改查
3. 基于spring data jpa 实现自定义查询
4. 如果spring data jpa 不能完成的sql 采用 自定义扩展类完成。
5. 在实际项目中去掉 persistence.xml 文件,完全采用配置 entityManagerFactory 来管理.

入门
一个典型的 persistence.xml 配置文件如下



	
		org.hibernate.ejb.HibernatePersistence
		com.training.jpa.domain.UserInfo
        com.training.jpa.domain.AccountInfo
		
			
			
			
			
			
			
			
			
			
		
	


请注意这个文件的位置,不是 webcontent目录下的 META-INF, 而是 classpath 目录下的META-INF目录下,一般来说也就是src目录下自己创建这个一个文件夹,然后把persistence.xml 放进去, 当然还需要相应的SPRING 配置
 

    

    
        
    

    
            
            
                
	                
	                
                
            
            
            
    


配置了transactionManager, entityManagerFactory 以及 JPA 采用 hibernate 的实现.

2. 基于spirng data jpa 实现增删改查
如果是单表的增删改查,很简单,直接调用 repository 的 save,delete,findAll,findOne 等方法。

3. 基于spring data jpa 实现自定义查询
这种情况下,需要在 repository 里面自定义方法,以及写 查询语句,类似如下:


public interface UserDao extends CrudRepository {
	
    public Page findByBalanceGreaterThan(Integer balance,Pageable pageable);
        
    @Query("Select account FROM AccountInfo account INNER JOIN FETCH account.userInfo user Where user.username like ? ")
    public List findAccountsByName(String name);
    
}

这样,在 service 中就能直接调用这个方法.

4. 如果spring data jpa 不能完成的sql 采用 自定义扩展类完成。
如果直接在 repository 中无法直接完成你的sql ,你可以自己扩展一个接口,然后,实现这个接口。比如:
自己扩展的接口

public interface UserDaoCustomize {		
	public List getAllUsers();
}
实现这个接口

public class UserDaoImpl implements UserDaoCustomize{		
	@PersistenceContext(unitName = "JPA")
	private EntityManager em;

	public List getAllUsers() {
		List users = em.createQuery("Select user FROM UserInfo user").getResultList();
		return users;
	}

}
再来看 repository 也要继承自己实现的接口

public interface UserDao extends CrudRepository, UserDaoCustomize {
	
    public Page findByBalanceGreaterThan(Integer balance,Pageable pageable);
        
    @Query("Select account FROM AccountInfo account INNER JOIN FETCH account.userInfo user Where user.username like ? ")
    public List findAccountsByName(String name);
    
}

这里面的重点就是实现类的写法,以及实现类的后缀是 Impl, 这点很重要,因为在配置文件中这样配置的,同时也是 spring data jpa 的默认配置. 另外实现类的名称要注意,我发现一般按照 repository的名字+Impl 一般没问题.

5. 在实际项目中去掉 persistence.xml 文件,完全采用配置 entityManagerFactory 来管理.
如果数据源都配置在persistence.xml 中是很郁闷的事,所以一般会采用 spring 来管理 datasource bean. 所以在实际项目中,可以不要 persistence.xml 配置文件,但需要在 spring 配置文件中这样配置:

		
		
		
			
				
				                
				
				
			
		
		
			
				false
				true
				true
                true
				net.sf.ehcache.hibernate.EhCacheProvider
				org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
			
		
		
			
				com.yihaomen.entity
			
		
	

		


这样全部由spring 注入.

参考: http://projects.spring.io/spring-data-jpa/, 下载spring-data-jpa.jar和spring-data-commons.jar包, Hibernate 与 Spring 所需要的包可以在官网下载.

测试源代码下载(里面包含了4个测试工程):

spring data jpa hibernate sample free download

上一篇: 给同事做的Hibernate4.2 注解映射以及缓存培训教程及例子
下一篇: Java 对芒果数据库 MongoDB的增删改查入门例子
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号