spring data jpa

23
Spring Data JPA Scott

Transcript of spring data jpa

Page 1: spring data jpa

Spring Data JPA

Scott

Page 2: spring data jpa

What’s the Spring Data?

Page 3: spring data jpa

Java Persistence API

Page 4: spring data jpa

Example

Group- id: Long- name: String

User- id: Long- userName: String- password: String- email: String

Role- id: Long- key: String- name: String

1

0..*

* *

Page 5: spring data jpa

Entities

Page 6: spring data jpa
Page 7: spring data jpa
Page 8: spring data jpa

DAO

Page 9: spring data jpa

Service

Page 10: spring data jpa

剛剛的Code有那些問題

1.在DAO中寫太多的code1.要自行定義通用的CRUD介面2.有通用介面,就會有抽像類別實作3.還得為各entity定DAO interface4.最後你得實作DAO interface,且extend抽像類別

2.實作DAO的過程中仍有重複的code3.要自已handle分頁4.混合著用DB,如: MySQL + SOLR

Page 11: spring data jpa

Refactoring DAO

Page 12: spring data jpa

Refactoring Service

Page 13: spring data jpa

Query methods

• Query Creation• @NamedQuery• @Query• @Modifying• Using named parameters

Page 14: spring data jpa

Query Creation

Page 15: spring data jpa

@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);

}

Page 16: spring data jpa

@Query

public class UserRepository extends JpaRepository<User, Long> {

@Query("select u from User u where u.email = ?1")public User findByEmail(String email);

}

Page 17: spring data jpa

@Modifying

@Modifying@Query("update User u set u.firstname = ?1 where u.lastname = ?2")public int setFixedFirstnameFor(String firstname, String lastname);

Page 18: spring data jpa

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);

}

Page 19: spring data jpa

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();

}

Page 20: spring data jpa

persistence.xml

Page 21: spring data jpa

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>

Page 22: spring data jpa

<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" />

Page 23: spring data jpa

Q & A