【问题标题】:Mapping 2 Tables with same structure in Hibernate在 Hibernate 中映射 2 个具有相同结构的表
【发布时间】: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,我已经放置了示例代码。你能帮忙吗?

标签: hibernate-mapping


【解决方案1】:

您可以使用继承的类/实体。由于我不知道您的确切用例,我建议您检查这些注释关键字:

  1. @MappedSuperclass
  2. @继承

这里解释一下它们的区别:@MappedSuperclass vs. @Inheritance

【讨论】:

  • 无法使用它,因为我无法修改现有类以使用 MappedSuperClass,并且我不希望在使用继承时启用多态查询。如果有办法选择性地禁用多态查询,那么我可以使用继承
  • 那么我看不到重用 POJO 的可能性。我想,你必须在这里复制你的 POJO :-(
  • 感谢您的确认。如果您知道以编程方式禁用多态查询或任何动态启用/禁用它们的解决方法,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2015-05-11
  • 2012-08-21
  • 2018-05-05
  • 2011-11-02
  • 2013-11-29
  • 1970-01-01
  • 2020-10-11
  • 2014-11-10
相关资源
最近更新 更多