在 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 引用未映射到单个属性

如何进行 Hibernate XML 映射,一对多使用 1 PK 映射到另一个具有复合键的实体

Hibernate体系结构

映射“一对多”关系的正确方法。在多个实体中具有相同关系时