在Spring Data JPA中处理实体继承的最佳方法

我有三个JPA实体类ABC具有以下层次结构:

    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

public A findByName(String name);

我还要在其他两个存储库中编写这种方法,这有点烦人。是否有更好的方法来处理这种情况?

我想知道的另一点是ARespository应该是只读存储库(即扩展Repository类),而其他两个存储库应公开所有CRUD操作。

让我知道可能的解决方案。

回答:

这个想法是创建一个通用的存储库类,如下所示:

@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为只读:

@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来实现读/写存储库:

@Transactional

public interface BRepository

extends ABaseRepository<B>, CrudRepository<B, Long>

{ /* ... */ }

以上是 在Spring Data JPA中处理实体继承的最佳方法 的全部内容, 来源链接: utcz.com/qa/431444.html

回到顶部