使用JPA和Hibernate时如何避免超类查询中的多态

时间:2018-12-07 19:11:50

标签: java hibernate jpa inheritance entity

我使用spring jpa + hibernate连接到具有两个表的CustomersLegacyCustomers Oracle数据库。

Customers通过添加一些其他列来扩展LegacyCustomers

@Entity
@Table(name="Customers")
public class Customers extends LegacyCustomers {
    @Column(name="NewId") private String newId;
    @Column(name="PhoneNumber") private String phoneNumber;
}

@Entity
@Table(name="LegacyCustomers")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class LegacyCustomers {
    @Column(name="OldId") private String oldId;
    @Column(name="Name") private String name;
    @Column(name="Address") private String address;
} 

但是它们是完全不同的表。我正在寻找一种表达Java关系的方法,但是要避免在查询超类表(LegacyCustomers)时冬眠产生的多态性。当我查询LegacyCustomers时,如何告诉hibernate仅使用超类中的列?

不幸的是,here提示的@Polymorphism注释无济于事。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

要实现您的目标,您需要对新的@MappedSuperclass类使用BaseCustomers批注,该类封装了公共属性:

@MappedSuperclass
public class BaseCustomers {
    @Column(name="OldId") private String oldId;
    @Column(name="Name") private String name;
    @Column(name="Address") private String address;
}

此后,LegacyCustomers仅扩展了BaseCustomers并且仅添加了@Entity注释,因为BaseCustomers不被视为实体:

@Entity
@Table(name="LegacyCustomers")
public class LegacyCustomers extends BaseCustomers {

}

Customers实体执行相同的操作:

@Entity
@Table(name="Customers")
public class Customers extends BaseCustomers {
    @Column(name="NewId") private String newId;
    @Column(name="PhoneNumber") private String phoneNumber;
}

就是这样。