【发布时间】:2015-02-17 01:47:20
【问题描述】:
我有三个 JPA 实体 类 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 中添加了这个方法:
public A findByName(String name);
我在其他两个仓库中也要写这样的方法,这有点烦人..有没有更好的方法来处理这种情况?
我想知道的另一点是 ARespository 应该是一个只读存储库(即扩展 Repository 类),而其他两个存储库应该公开所有 CRUD 操作。
让我知道可能的解决方案。
【问题讨论】:
-
你可以写public abstract A findByName(String name),所以所有子类都必须实现这个方法。
-
@s.kwiotek 但我不想实现这样的方法(Spring Data JPA 为我做这件事,有一些魔力:)).. 我只会在一个地方定义它,比如
ARespository.. -
我在存储库中发现的一件事是实体中的继承并不决定存储库中的继承。 Banana 是“一种”水果,而 BananaBox 不是 FruitBasket。可以这么说。我通过 composition 让 BananaRepo 使用 FruitRepo 取得了更大的成功,仅在 (A)
SELECT部分访问它查询,并 (B) 填充刚刚实例化的 Banana 的基本 Fruit-properties。不过,您必须检查 Spring 是否可以做到这一点。
标签: java spring spring-data spring-boot spring-data-jpa