hibernate-mapping - 在 Hibernate 中映射 2 个具有相同结构的表
问题描述
我有一个带有实体的现有应用程序,例如 Employee (Table 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 实体。
- 每当不需要多态查询功能时,我将使用第一个会话工厂,否则使用第二个。
如果有人知道更好的解决方案,请帮助我以更好的方式解决这个问题。
解决方案
您可以使用继承的类/实体。由于我不知道您的确切用例,我建议您检查这些注释关键字:
- @MappedSuperclass
- @遗产
以下是关于它们的差异的解释:@MappedSuperclass vs. @Inheritance