Spring Data JPA
Scott
What’s the Spring Data?
Java Persistence API
Example
Group- id: Long- name: String
User- id: Long- userName: String- password: String- email: String
Role- id: Long- key: String- name: String
1
0..*
* *
Entities
DAO
Service
剛剛的Code有那些問題
1.在DAO中寫太多的code1.要自行定義通用的CRUD介面2.有通用介面,就會有抽像類別實作3.還得為各entity定DAO interface4.最後你得實作DAO interface,且extend抽像類別
2.實作DAO的過程中仍有重複的code3.要自已handle分頁4.混合著用DB,如: MySQL + SOLR
Refactoring DAO
Refactoring Service
Query methods
• Query Creation• @NamedQuery• @Query• @Modifying• Using named parameters
Query Creation
@NamedQuery@Entity@NamedQuery(
name="User.findByEmail", query="select u from User u where u.email = ?1"
)public class User {
}
public class UserRepository extends JpaRepository<User, Long> {
public User findByEmail(String email);
}
@Query
public class UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.email = ?1")public User findByEmail(String email);
}
@Modifying
@Modifying@Query("update User u set u.firstname = ?1 where u.lastname = ?2")public int setFixedFirstnameFor(String firstname, String lastname);
Using named parameters
public class UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.email = ?1")public User findByEmail(String email);
}
public class UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u where u.email = :email")public User findByEmail(@Param("email") String email);
}
Transactional query methods
@Transactional(readOnly=true)public interface UserRepository extends JpaRepository<User, Long> {
public List<User> findByLastname(String lastname);
@Modifying @Transactional @Query("delete from User u where u.active = false") public void deleteInactiveUsers();
}
persistence.xml
Configuration<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" /><property name="generateDdl" value="true" /><property name="database" value="MYSQL" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" >
<property name="persistenceUnitName" value="appJPA" /><property name="dataSource" ref="dataSource" /><property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="entityManagerFactory" /><property name="nestedTransactionAllowed" value="true" />
</bean>
<jpa:repositoriesbase-package="com.gorilla.netstream.*.repository" transaction-manager-ref="transactionManager" entity-manager-factory-ref="entityManagerFactory"
/>
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
Q & A