java - 一个 Java 类和多个表的 Hibernate 最佳方法?

标签 java hibernate mapping

换句话说:您如何为许多不同的父实体建模/映射大量重用的子类/表?

我有几个实体类型,每个实体类型都保存在自己的表中:

A 类 --> A 表 B类-->表B ....

现在我需要让这些类中的每一个成为 1:M 单向子集合的父类。该集合是实体随时间获得批准的历史记录。子域类称为“ApprovalItem”。 Approval 类对于所有类型的 parent 都完全相同。

绘制此 map 的最佳方式是什么?如果我创建一个单独的表来保存所有 ApprovalItems,那么我就无法强制执行与实体 PK 的 FK 关系和/或我留下了糟糕的数据库设计。

另一方面,我可以为每个实体类型(例如 A_ApprovalItems、B_ApprovalItems 等)创建一个 ApprovalIems 表。这在数据库方面似乎是一个很好的模式,但似乎我需要在 Java 中为每个实体批准创建一个单独的域类(例如 AAprrovalItem 类、BApprovalItem 类等)。在 Java 中创建如此多的新类似乎有很多麻烦和复杂性,除了允许我放入不同的 JPA 映射注释之外什么都不做。

Hibernate 中是否有一种映射技术允许我根据集合的父所有者是谁将 Java 中的一个类映射到几个不同的表?

最佳答案

I could create an ApprovalItem table for each entity type (e.g. A_ApprovalItem, B_ApprovalItem, etc.). This seems like a good schema on the database side

但是

It seems i need to create a separate domain classes in Java for each entity approval (e.g. AAprrovalItem class, BApprovalItem class, etc.).

你不需要它。您可以创建单个 ApprovalItem 类并在父类和 ApprovalItem 之间创建 @OneToMany 关系。 Hibernate 注意为每个关系创建一个链接表。

@Entity
public class ClassA {

    @Id
    @GeneratedValue 
    private Integer id;

    // Hibernate will create CLASSA_APPROVALITEM to link both class
    @OneToMany
    private List<ApprovalItem> approvalItemList;

}

@Entity
public class ClassB {

    @Id
    @GeneratedValue 
    private Integer id;

    // Hibernate will create CLASSB_APPROVALITEM to link both class
    @OneToMany
    private List<ApprovalItem> approvalItemList;

}

还有你的 ApprovalItem 类

@Entity
public class ApprovalItem {

    @Id
    @GeneratedValue 
    private Integer id;

    // Nothing else

}

但是让我们看看 Java Persistence with Hibernate 这本书是怎么说的

You may have shared references to the Bid objects. As suggested earlier, a User may have a collection of references to the Bid instances they made. You can’t delete an item and all its bids without removing these references first. You may get an exception if you try to commit this transaction, because a foreign key constraint may be violated.

因此在处理共享引用时请牢记这一点。

为了查看目标模式的外观,您可以使用以下内容

AnnotationConfiguration configuration = new AnnotationConfiguration();

configuration
    .addAnnotatedClass(ClassA.class)
    .addAnnotatedClass(ClassB.class)
    .addAnnotatedClass(ApprovalItem.class)
    .setProperty(Environment.USER, <TYPE_YOUR_USER>)
    .setProperty(Environment.PASS, <TYPE_YOUR_PASSWORD>)
    .setProperty(Environment.URL, <TYPE_YOUR_URL>)
    .setProperty(Environment.DIALECT, <TYPE_YOUR_DIALECT>)
    .setProperty(Environment.DRIVER, <TYPE_YOUR_DRIVER>);

SchemaExport schema = new SchemaExport(configuration);
schema.setOutputFile("schema.sql");

schema.create(<DO_YOU_WANT_TO_PRINT_TO_THE_CONSOLE>, <DO_YOU_WANT_TO_EXPORT_THE_SCRIPT_TO_THE_DATABASE>);

它将生成一个名为 schema.sql 的文件,其中包含您的目标模式

问候,

关于java - 一个 Java 类和多个表的 Hibernate 最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410884/

相关文章:

java - 使用哪种模式打开和关闭 hibernate session (MyFaces 2.2.2 + Spring 4.0.3 + Hibernate 4.3.2)

java - 自定义 Spring Data 查询

java - Hibernate Association 在映射类时引用未映射的类

java - 无法使用 ImageIO 从 Controller 写入 tif 文件

java - 如何配置 hibernate 以扫描不同模块中的实体

php - Symfony2 - 学说 :schema:update fails with entity outside of a bundle ( decoupled )

c++ - 通过着色器的 OpenGL 投影纹理映射

java - 将编码字符串转换为 Base64 格式时出现未知字符

java - 小程序出现奇怪的 ClassNotFound 错误

mysql - 性能:MySQL 中的 OR 条件会显着降低内部连接速度吗?