Java/Hibernate - 继承存储库架构

标签 java spring hibernate jpa spring-data-jpa

我的数据库中有一个层次结构,如下所示:

            +-------+
            |  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 */
}

然后我有我按照 this guide 开发的存储库:

@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 。它在文章和 Spring 指南中提到为“只读”操作定义一个基本存储库,但是当有人可以使用 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 使用有关实际存储库接口(interface)的泛型和方法元数据的信息。 它确实包含从其他接口(interface)继承的分析方法,但是一条信息直接来自该接口(interface)还是来自 super 接口(interface)都没有什么区别。因此,只要生成的接口(interface)相同(即具有相同的方法、相同的泛型类型),存储库接口(interface)的继承结构并不重要。

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

关于Java/Hibernate - 继承存储库架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959590/

相关文章:

java - 使用 WireMock 测试 Spring JUnit 中的多个应用程序上下文

model-view-controller - 数据模型中的Spring Formatters,这是否违反了MVC?有更好的选择吗?

java - 使用 Spring boot 和 Jackson 的日期时区

hibernate - 一对多Grails-映射级联

java - Hibernate - 如何使用生成器为引用表创建主键?

java - 在 CUDA 上运行 JVM

通过 PHP 执行时 Java 无法找到类,相同的命令在 CLI 中有效

java - 在 Java 中抛出异常是否昂贵?

Spring Boot 不读取环境特定的 YAML 文件

java - HQL 嵌套子查询