spring data jpa如何使用自定義repository實現類
spring data jpa使用自定義repository實現類
spring data jpa中使用JpaRepository等接口定義repository時,將默認使用SimpleJpaRepository
可通過自定義實現類,改寫或自定義接口方法邏輯:
創建MyJpaRepository實現類
@Repository @Transactional(readOnly = true) public class MyRepositoryImpl<T,ID> extends SimpleJpaRepository<T, ID> { public MyRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) { super(entityInformation, entityManager); } public MyRepositoryImpl(Class<T> domainClass, EntityManager em) { super(domainClass, em); } ... }
創建MyJpaRepositoryFactoryBean
public class MyJpaRepositoryFactoryBean<R extends Repository<T, ID>, T, ID> extends JpaRepositoryFactoryBean<R, T, ID> { public MyJpaRepositoryFactoryBean(Class<? extends R> repositoryInterface) { super(repositoryInterface); } @SuppressWarnings("rawtypes") protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) { return new MyJpaRepositoryFactory(em); } private static class MyJpaRepositoryFactory<T, ID> extends JpaRepositoryFactory { private final EntityManager em; public MyJpaRepositoryFactory(EntityManager em) { super(em); this.em = em; } @Override protected JpaRepositoryImplementation<?, ?> getTargetRepository(RepositoryInformation information, EntityManager entityManager) { return new EntityJPARepositoryImpl<E>( (Class<E>) information.getDomainType(), entityManager); } protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { return MyRepositoryImpl.class; } } }
配置JPA
@Configuration @EnableJpaRepositories(basePackages = {...}, repositoryFactoryBeanClass = MyJpaRepositoryFactoryBean.class) public class JPAConfig {}
Jpa自定義Repository方法
如果不使用SpringData的方法,想要自己實現,該怎麼辦呢?
定義一個接口: 聲明要添加的, 並自實現的方法
提供該接口的實現類: 類名需在要聲明的 Repository 後添加 Impl, 並實現方法
聲明 Repository 接口, 並繼承 1) 聲明的接口
註意: 默認情況下, Spring Data 會在 base-package 中查找 “接口名Impl” 作為實現類. 也可以通過 repository-impl-postfix 聲明後綴.
這張圖是類與接口之間的關系
下面是具體的實現:
包結構
類與接口之間的關系代碼
public interface PersonRepositoiry extends JpaRepository<Person, Integer> ,PersonDao{ public interface PersonDao { void test(); } @Repository public class PersonRepositoiryImpl implements PersonDao{ @PersistenceContext private EntityManager em; @Override public void test() { //隻是用來測試 Person person = em.find(Person.class, 1); System.out.println(person); } }
測試代碼
@Test public void testCustomerRepositoryMethod() { personRepositoiry.test(); }
經過實踐發現
- XXXRepositoryImpl 與XXXRepository前面的名字必須相同,後面的也需要按照規則寫
- 若將XXXRepositoryImpl與XXXRepository接口放在同意包下,XXXRepositoryImpl不需要添加@Repository註解,但是當XXXRepositoryImpl與XXXRepository接口不在同一包下,需要在在XXXRepositoryImpl類上加@Repository註解進行修飾
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 如何為Repository添加自定義方法
- 基於JPA的Repository使用詳解
- spring-data-jpa使用自定義repository來實現原生sql
- 一篇文章帶你深入瞭解Java對象與Java類
- Java中超詳細this與super的概念和用法