首页 > 解决方案 > 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> {
}

一切都会很好。我在这里想念什么?

标签: javaspringhibernatejpaspring-data-jpa

解决方案


的唯一目的FooBaseRepository是在所有三个存储库中为您想要的方法提供一个主页。如果你没有/想要这样的方法,你可以放弃它。

Spring Data 使用有关实际存储库接口的泛型和方法元数据的信息。它确实包含在从其他接口继承的分析方法中,但是如果一条信息直接来自接口或来自超接口,则没有区别。因此,只要生成的接口相同(即它具有相同的方法、相同的泛型),存储库接口的继承结构就无关紧要。

注意:我不认为这篇文章试图说基本接口是用于只读方法的,它只是说:如果它适用于您的案例,您可以将其标记为这样,并从底层 JPA 实现所做的任何优化中获益只读访问。


推荐阅读