我可以为每种实体类型(例如 A_ApprovalItem、B_ApprovalItem 等)创建一个 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 对象有共享引用。如前所述,用户可能有一组对他们所做的投标实例的引用。如果不先删除这些引用,您将无法删除项目及其所有出价。如果您尝试提交此事务,您可能会遇到异常,因为可能违反外键约束。
所以在处理共享引用时请记住这一点。
为了查看目标架构的样子,您可以使用以下内容
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 的文件,其中包含您的目标架构
问候,