Spring Data JPA

Spring Data JPA

From the-persistence-layer-with-spring-data-jpa

1. OverView

这篇文章将致力于结束SpringDataJPA在Spring4中的应用。。。

2. Spring Data 自动生成DAO 不再需要手动实现DAO

使用Spring Data,只需手写Dao interface,需要继承JpaRepository接口。

3. 自定义访问方法和查询语句

为了定义更明确的访问方法,Spring JPA 支持几种选择

  • 定义一个新方法在接口
  • 提供真正的JPQ语句通过@Query注解
  • 使用更高级的Specification and Querydsl support
  • 定义自定义查询语句通过JPA指定名字的的查询JPA Named Queries @NamedQuery

3.1 自动自定义查询

public interface IFooDAO extends JpaRepository< Foo, Long >{

   Foo findByName( String name );

}

有可能出现的错误

java.lang.IllegalArgumentException: No property name found for type class org.rest.model.Foo  

Spring Data JPA 所支持的方法关键字query-methods.query-creation

spring<em>data</em>jpa<em>method</em>keywords

3.2 手动自定义查询

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);  

Using named parameters

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);
}

4. 事务配置

既然我们不直接用DAO,真实的DAO实现被隐藏了。SimpleJpaRepository是个足够简单的实现,SimpleJpaRepository 通过注解定义了事务
更明白的说,一个read-only @Transactional 注解用在class级别。但它还是会被读写事务的nonread-only方法所覆盖。其他的方法事务都是默认的,但是都很容易通过在方法之前手动指定覆盖。

4.1. 异常转换还可以用

问题是,既然我们没有使用默认的Spring ORM templates 模板,比如,(JpaTemplate, HibernateTemplate),是不是我们就失去了Spring Data JPA的异常转化?我们是不是就不会获取到被转化成Spring’s DataAccessException hierarchy的JPA异常?

不是,异常转换仍然可以起作用通过在DAO上使用@Repository注解。这个注解打开了一个Spring的后处理bean, 带着PersistenceExceptionTranslator切入了容器内的所有的@Repository beans。

测试异常

@Test(expected = DataIntegrityViolationException.class)
public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() {  
    service.create(new Foo());
}

记住,异常转换通过代理实现,所以为了让Spring可以创建代理around DAO类,DAO类千万不能是final的。

5. Spring Data 配置

基于xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
   xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/data/jpa
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

<jpa:repositories base-package="org.rest.dao.spring" />

</beans>  

基于注解

@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
public class PersistenceConfig { ... }  

6. The Spring Java or XML Configuration

7. The Maven Dependency

<dependency>  
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
   <version>1.6.0.RELEASE</version>
</dependency>  

Related Article