java - Java/Hibernate - 继承存储库架构
问题描述
我有一种情况,我的数据库中有一个层次结构,如下所示:
+-------+
| Foo |
+-------+
| Id |
| Type |
| Color |
+-------+
+------------+ +------------+
| A | | B |
+------------+ +------------+
| FooId | | FooId |
| Status | | Connection |
| SourceType | | Comments |
+------------+ +------------+
现在这里是我的 java 实体:
@Entity
@Table(name = "Foo", schema = "dbo")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Foo {
/* fields, getters, setters, constructors */
}
@Entity
@Table(name = "A", schema = "dbo")
@PrimaryKeyJoinColumn(name = "FooId")
public class A extends Foo {
/* fields, getters, setters, constructors */
}
@Entity
@Table(name = "B", schema = "dbo")
@PrimaryKeyJoinColumn(name = "FooId")
public class B extends Foo {
/* fields, getters, setters, constructors */
}
然后我有我按照本指南开发的存储库:
@NoRepositoryBean
public interface FooBaseRepository<T extends Foo> extends Repository<T, Integer> {
}
public interface FooRepository extends FooBaseRepository<Foo>, JpaRepository<Foo, Integer> {
}
public interface ARepository extends FooBaseRepository<A>, JpaRepository<A, Integer> {
}
public interface BRepository extends FooBaseRepository<B>, JpaRepository<B, Integer> {
}
我已经让这一切正常工作了,没问题。但是在进一步检查这个架构后,我想知道,为什么我什至需要FooBaseRepository
. FooRepository
它在文章和春季指南中说为“只读”操作定义一个基本存储库,但是当有人可以使用它来执行读/写操作时,创建这个基本只读存储库的麻烦有什么意义?
似乎这种情况只需要以下回购:
public interface FooRepository extends JpaRepository<Foo, Integer> {
}
public interface ARepository extends JpaRepository<A, Integer> {
}
public interface BRepository extends JpaRepository<B, Integer> {
}
一切都会很好。我在这里想念什么?
解决方案
的唯一目的FooBaseRepository
是在所有三个存储库中为您想要的方法提供一个主页。如果你没有/想要这样的方法,你可以放弃它。
Spring Data 使用有关实际存储库接口的泛型和方法元数据的信息。它确实包含在从其他接口继承的分析方法中,但是如果一条信息直接来自接口或来自超接口,则没有区别。因此,只要生成的接口相同(即它具有相同的方法、相同的泛型),存储库接口的继承结构就无关紧要。
注意:我不认为这篇文章试图说基本接口是用于只读方法的,它只是说:如果它适用于您的案例,您可以将其标记为这样,并从底层 JPA 实现所做的任何优化中获益只读访问。