使用 JPA 和 Hibernate 时如何避免超类查询中的多态性
How to avoid polymorphism in superclass query when using JPA and Hibernate
我使用 spring jpa+hibernate 连接到具有 2 tables 的 Oracle 数据库:Customers
和 LegacyCustomers
.
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;
}
然而它们是完全不同的table。我正在寻找一种方法来表达 java 中的关系,但要避免 hibernate 在查询超类 table (LegacyCustomers
) 时创建的多态性。当我查询 LegacyCustomers
?
时,如何告诉 hibernate 仅使用超类中的列
不幸的是,建议的 @Polymorphism
注释 没有帮助。
感谢您的帮助
为了实现您的目标,您需要使用 @MappedSuperclass
注释来代替封装公共属性的新 BaseCustomers
class:
@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;
}
就是这样。
我使用 spring jpa+hibernate 连接到具有 2 tables 的 Oracle 数据库:Customers
和 LegacyCustomers
.
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;
}
然而它们是完全不同的table。我正在寻找一种方法来表达 java 中的关系,但要避免 hibernate 在查询超类 table (LegacyCustomers
) 时创建的多态性。当我查询 LegacyCustomers
?
不幸的是,建议的 @Polymorphism
注释
感谢您的帮助
为了实现您的目标,您需要使用 @MappedSuperclass
注释来代替封装公共属性的新 BaseCustomers
class:
@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;
}
就是这样。