首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate是一个Java类和多个表的最佳方法吗?

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

Stack Overflow用户
提问于 2010-03-10 01:02:09
回答 2查看 5.4K关注 0票数 4

换句话说:如何对一个被大量重用的子类/表进行建模/映射到许多不同的父实体?

我有几个实体类型,每个实体类型都持久化到自己的表中:

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

现在,我需要使这些类中的每个类都成为1:M单向子集的父类。集合是实体随着时间的推移而获得的批准的历史记录。子域类称为"ApprovalItem“。审批类对于所有类型的父级都是完全相同的。

最好的映射方式是什么?如果我创建一个表来保存所有的ApprovalItems,那么我不能强制FK关系到实体的PK和/或我留下了一个糟糕的数据库设计。

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

Hibernate中有没有一种映射技术,可以让Java中的一个类根据集合的父所有者映射到几个不同的表?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-10 02:15:27

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

而不是

似乎我需要在

中为每个实体审批创建一个单独的域类(例如AAprrovalItem类、BApprovalItem类等)。

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

代码语言:javascript
运行
复制
@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类

代码语言:javascript
运行
复制
@Entity
public class ApprovalItem {

    @Id
    @GeneratedValue 
    private Integer id;

    // Nothing else

}

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

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

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

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

代码语言:javascript
运行
复制
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的文件,其中包含您的目标模式

致以敬意,

票数 3
EN

Stack Overflow用户

发布于 2010-03-10 01:08:33

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

否则,我认为有多个“什么都不做”的ApprovalItem派生类没有问题,就像你说的,因为它确实区分了批准,这就像拥有一种类型的批准。看到您的模型是这样的,我建议您使用多个类,即使它们只继承自您的ApprovalItem基类。

我是否很好地理解了你的问题,或者我漏掉了一些更微妙的东西?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2410884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档