我有三个JPA实体类A,B并C具有以下层次结构:
A
B
C
A | +---+---+ | | C B
那是:
@Entity @Inheritance public abstract class A { /* ... */ } @Entity public class B extends A { /* ... */ } @Entity public class C extends A { /* ... */ }
使用Spring Data JPA,为此类实体编写存储库类的最佳方法是什么?
我知道我可以写这些:
public interface ARespository extends CrudRepository<A, Long> { } public interface BRespository extends CrudRepository<B, Long> { } public interface CRespository extends CrudRepository<C, Long> { }
但是,如果在类中A有一个字段name,我在ARepository:
name
ARepository
public A findByName(String name);
我还要在其他两个存储库中编写这种方法,这有点烦人。是否有更好的方法来处理这种情况?
我想知道的另一点是ARespository应该是只读存储库(即扩展Repository类),而其他两个存储库应公开所有CRUD操作。
ARespository
Repository
让我知道可能的解决方案。
这个想法是创建一个通用的存储库类,如下所示:
@NoRepositoryBean public interface ABaseRepository<T extends A> extends CrudRepository<T, Long> { // All methods in this repository will be available in the ARepository, // in the BRepository and in the CRepository. // ... }
然后我可以用这种方式编写三个存储库:
@Transactional public interface ARepository extends ABaseRepository<A> { /* ... */ } @Transactional public interface BRepository extends ABaseRepository<B> { /* ... */ } @Transactional public interface CRepository extends ABaseRepository<C> { /* ... */ }
此外,要获得一个只读存储库,ARepository我可以将其定义ABaseRepository为只读:
ABaseRepository
@NoRepositoryBean public interface ABaseRepository<T> extends Repository<T, Long> { T findOne(Long id); Iterable<T> findAll(); Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
并且BRepository还扩展了Spring Data JPA CrudRepository来实现读/写存储库:
BRepository
CrudRepository
@Transactional public interface BRepository extends ABaseRepository<B>, CrudRepository<B, Long> { /* ... */ }