Hibernate是一个Java类和多个表的最佳方法吗?

时间:2010-03-09 17:02:09

标签: java hibernate mapping

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

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

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

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

映射此图的最佳方法是什么?如果我创建一个表来保存所有ApprovalItems,那么我就不能强制实体的PK和/或我的数据库设计错误。

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

Hibernate中是否有一种映射技术允许我在Java映射中将一个类映射到几个不同的表,具体取决于该集合的父拥有者是谁?

2 个答案:

答案 0 :(得分:3)

  

我可以为每个实体类型创建一个ApprovalItem表(例如A_ApprovalItem,B_ApprovalItem等)。这似乎是数据库方面的一个好模式

<强>但是

  

似乎我需要在Java中为每个实体批准创建一个单独的域类(例如AAprrovalItem类,BApprovalItem类等)。

你不需要它。您可以创建一个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一书中有关它的内容

  

您可能对Bid对象有共享引用。如前所述,用户可能拥有对其所作出的Bid实例的引用集合。如果不首先删除这些引用,则无法删除项目及其所有出价。如果您尝试提交此事务,则可能会出现异常,因为可能违反了外键约束

在处理共享引用时请记住这一点。

为了查看目标架构的外观,您可以使用以下

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的文件,其中包含您的目标架构

的问候,

答案 1 :(得分:2)

Chapter 8. Inheritance Mapping的Hibernate文档可能有所帮助。

否则,我认为有多个ApprovalItem派生类“无所事事”没问题,就像你说的那样,因为它确实区分了Approval,就像拥有一种批准类型一样。看到你的模型,我建议使用多个类,即使它们只从你的基础ApprovalItem类继承。

我是否理解了您的问题,或者我错过了其他更微妙的内容?