如何使用 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:如何强制隐式连接使用 LEFT OUTER JOINS