在 Hibernate 中映射 2 个具有相同结构的表
Posted
技术标签:
【中文标题】在 Hibernate 中映射 2 个具有相同结构的表【英文标题】:Mapping 2 Tables with same structure in Hibernate 【发布时间】:2018-11-20 10:15:13 【问题描述】:我有一个包含实体的现有应用程序,例如员工(表 EMP),它在多个地方使用。现在经过很长时间,为表 EMP 创建了一个副本(EMP_ARC),我们应该在某些情况下引用它。
由于表结构完全相同,我想重用 POJO 声明。但是我找不到为两个不同的表声明重用相同 POJO 的方法。 (我看到了将一个 POJO 映射到多个表的 XML 映射示例,但是我们的应用程序正在使用注释,并且无法找到带有注释的此类选项)
我不能使用继承策略,因为多态查询会降低应用程序的性能,并且只能在需要时引用 EMP_ARC 表。
谁能告诉我创建一个重复的 POJO 并将其映射到副本表是唯一的解决方案还是任何其他方法可用。
**Sample Code:**
Table structure for EMP and EMP_ARC (exactly same structure)
EMP_ID LONG
EMP_NAME VARCHAR2(100)
**Existing Java Bean mapped to EMP**
**This entity bean cannot be modified**
//getter and setters omitted
@Entity
@Table(name="EMP")
public class Employee
@Id
@Column(name="EMP_ID")
Long empid;
@Column(name="EMP_NAME")
String empName;
//Scenario 1 Query EMP table
String hql = "from Employee";
//Scenario 2 Query EMP_ARC table -- Like SELECT * FROM EMP_ARC
//Not sure of how to write the HQL using the same Employee POJO.
//Output of this HQL has to be an Employee POJO.
我也想将同一个 Employee POJO 映射到 EMP_ARC 表,但找不到方法。
或者,如果我可以选择性地启用/禁用多态查询,那么我将能够将继承与策略 TABLE_PER_CLASS 一起使用。
--- 解决方法---
为了动态启用或禁用多态查询,我使用了两个不同的会话工厂。
我有两个 POJO Employee 和 EmployeeArc(继承 Employee)。 使用的继承策略是 TABLE_PER_CLASS。 一个会话工厂将单独引用 Employee 实体,而另一个会话工厂将同时具有 Employee 和 EmployeeArc 实体。 只要不需要多态查询功能,我就会使用第一个会话工厂,否则使用第二个。如果有人知道更好的解决方案,请帮助我以更好的方式解决这个问题。
【问题讨论】:
你写过代码吗?如果有,请分享。 嗨@Christopher,我已经放置了示例代码。你能帮忙吗? 【参考方案1】:您可以使用继承的类/实体。由于我不知道您的确切用例,我建议您检查这些注释关键字:
-
@MappedSuperclass
@继承
这里解释一下它们的区别:@MappedSuperclass vs. @Inheritance
【讨论】:
无法使用它,因为我无法修改现有类以使用 MappedSuperClass,并且我不希望在使用继承时启用多态查询。如果有办法选择性地禁用多态查询,那么我可以使用继承 那么我看不到重用 POJO 的可能性。我想,你必须在这里复制你的 POJO :-( 感谢您的确认。如果您知道以编程方式禁用多态查询或任何动态启用/禁用它们的解决方法,请告诉我。以上是关于在 Hibernate 中映射 2 个具有相同结构的表的主要内容,如果未能解决你的问题,请参考以下文章
休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?
如何使用 hibernate/jpa 注释将一个类映射到不同的表
org.hibernate.AnnotationException:referencedColumnNames 引用未映射到单个属性