换句话说:如何对一个被大量重用的子类/表进行建模/映射到许多不同的父实体?
我有几个实体类型,每个实体类型都持久化到自己的表中:
A类-->表A类B -->表B....
现在,我需要使这些类中的每个类都成为1:M单向子集的父类。集合是实体随着时间的推移而获得的批准的历史记录。子域类称为"ApprovalItem“。审批类对于所有类型的父级都是完全相同的。
最好的映射方式是什么?如果我创建一个表来保存所有的ApprovalItems,那么我不能强制FK关系到实体的PK和/或我留下了一个糟糕的数据库设计。
另一方面,我可以为每种实体类型(例如A_ApprovalItems、B_ApprovalItems等)创建一个ApprovalIems表。在数据库端,这似乎是一个很好的模式,但是我似乎需要用Java语言为每个实体审批创建一个单独的域类(例如,AAprrovalItem类、BApprovalItem类等)。在Java中创建这么多新类,除了允许我放入不同的JPA映射注释之外,什么也不做,这似乎有很多麻烦和复杂性。
Hibernate中有没有一种映射技术,可以让Java中的一个类根据集合的父所有者映射到几个不同的表?
发布于 2010-03-10 02:15:27
我可以为每种实体类型(例如A_ApprovalItem、B_ApprovalItem等)创建一个ApprovalItem表。在数据库端,这似乎是一个很好的模式
而不是
似乎我需要在
中为每个实体审批创建一个单独的域类(例如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的文件,其中包含您的目标模式
致以敬意,
发布于 2010-03-10 01:08:33
Hibernate文档的Chapter 8. Inheritance Mapping可能会有所帮助。
否则,我认为有多个“什么都不做”的ApprovalItem派生类没有问题,就像你说的,因为它确实区分了批准,这就像拥有一种类型的批准。看到您的模型是这样的,我建议您使用多个类,即使它们只继承自您的ApprovalItem基类。
我是否很好地理解了你的问题,或者我漏掉了一些更微妙的东西?
https://stackoverflow.com/questions/2410884
复制相似问题