换句话说:如何将经过大量重用的子类/表建模/映射到许多不同的父实体?
我有几个实体类型,每个实体类型都持久保存在自己的表中:
A类 - >表A. B级 - >表B. ....
现在我需要让这些类中的每一个都成为1:M单向子集合的父类。该集合是该实体随时间获得的批准历史。 Child域类称为“ApprovalItem”。 Approval类对于所有类型的父母都是完全相同的。
映射此图的最佳方法是什么?如果我创建一个表来保存所有ApprovalItems,那么我就不能强制实体的PK和/或我的数据库设计错误。
另一方面,我可以为每个实体类型创建一个ApprovalIems表(例如A_ApprovalItems,B_ApprovalItems等)。这似乎是数据库方面的一个好模式,但似乎我需要在Java中为每个实体批准创建一个单独的域类(例如AAprrovalItem类,BApprovalItem类等)。在Java中创建如此多的新类似乎有很多麻烦和复杂性,除了允许我输入不同的JPA映射注释之外什么都不做。
Hibernate中是否有一种映射技术允许我在Java映射中将一个类映射到几个不同的表,具体取决于该集合的父拥有者是谁?
答案 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类继承。
我是否理解了您的问题,或者我错过了其他更微妙的内容?