spring data jpa

Preview:

Citation preview

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

Recommended