如何使用 hibernate/jpa 注释将一个类映射到不同的表

Posted

技术标签:

【中文标题】如何使用 hibernate/jpa 注释将一个类映射到不同的表【英文标题】:How to map one class to different tables using hibernate/jpa annotations 【发布时间】:2011-03-31 04:05:24 【问题描述】:

我目前遇到了一个看似非常简单的问题,但我似乎找不到解决方法:

我有 2 个相同的表:

    tbl_creditcard_approved_txns tbl_creditcard_declined_txns

两者中的字段是相同的,我有一个类 - Transaction 用于表示表中所有适当的字段。

我正在尝试将两个不同的实体(每个表一个)映射到上述类。在旧世界中,我会创建两个hbm.xml 文件,每个表一个,并将它们都映射到Transaction。然后,我会在持久化期间使用实体名称来确保对象被持久化在正确的表中,具体取决于具体情况。

我目前正在尝试使用注释来实现相同的目的,但到目前为止,我还没有成功将 2 个实体映射到 single 类。这可能吗?

我目前正在使用不同的方法,因为我已将所有公共字段(相同的列名)提取到 @MappedSuperClass 中,并创建了两个从超类扩展的独立类(每个实体一个)(这些类只是具有相同的字段,但在适用的情况下具有不同的列名)。

【问题讨论】:

JPA, How to use the same class (entity) to map different tables? 的可能重复项 Pascal,这确实是意图,唯一的区别是我希望将两个不同的实体映射到同一个类。与 JPA 不同,在 hibernate 中,类可以与实体不同。然而,从本质上讲,我真的在尝试将一个类映射到两个表。 【参考方案1】:

使用@MappedSuperclass,您可以进行如下操作:

@MappedSuperclass
public class Transaction ...

@Entity
@Table(name="tbl_creditcard_approved_txns")
public class DeclinedTransaction extends Transaction ...

@Entity
@Table(name="tbl_creditcard_declined_txns")
public class ApprovedTransaction extends Transaction ...

如果需要,使用 @AttributeOverride 覆盖两种类型的 Transaction 对象之间的列名。

更新:我看到您想将一个 @Entity 映射到同一个 EntityManagerFactory 中的两个表...我认为您不能这样做。

【讨论】:

LES2,谢谢您的回复。你建议的是我目前采取的方法。正如您所观察到的,我想知道是否可以将一个实体映射到两个不同的表。 如果我将一行从一个表移动到另一个表,如何确保行 ID 保持不变? 这听起来是个坏主意,但我不完全确定为什么 :) 这违反了我的直觉。保持行 ID 相同的用例是什么?【参考方案2】:

另一种方法是在数据库层上使用分区表,然后使一个表对您的 java 代码可见。

这可能是一般规则要走的路,您执行的分区越智能,查询速度就越快。

mysql Oracle

【讨论】:

【参考方案3】:

您必须使用两个不同的持久性单元或两个单独的实体。这已经回答了here。

【讨论】:

以上是关于如何使用 hibernate/jpa 注释将一个类映射到不同的表的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate/JPA 是不是考虑了瞬态修饰符(而不是注释)

Spring Security 3 身份验证与 Hibernate 3(JPA) 注释的集成

Hibernate/JPA 注释中的多列连接

Hibernate/JPA:如何强制隐式连接使用 LEFT OUTER JOINS

Hibernate/JPA - 使用@Future 更新还包含日期字段的实体字段

在运行时更新 Springboot 属性 Hibernate/JPA