我有一个遗留的MS SQL Server 2000数据库我试图用JPA映射(准确地说是EclipseLink)。
我有一个表格“CONTACT1”,文字字段为“KEY1”,可以是“联系人”或“资产”,我正在使用:
@Table(name = "CONTACT1")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "KEY1")
public abstract class Record {
将其映射到两个不同的类(联系人和资产)。
@Entity
@DiscriminatorValue(value = "Contact")
public class Contact extends Record {...}
和
@Entity
@DiscriminatorValue(value = "Asset")
public class Asset extends Record {...}
不幸的是我发现了一些或记录丢失,经过进一步分析后我发现一些联系人记录的“KEY1”字段设置为NULL。
虽然我可以运行更新查询来解决问题但我想避免这种情况 - 有没有办法将'NULL'值映射到Contact类?
如果失败了,JPA中是否有一种机制可以预先过滤记录集,使得JPA认为该字段不是NULL但是它中写有“联系人”?
答案 0 :(得分:0)
您需要运行更新并将正确的值分配给数据库中具有空值的行。我还建议您修改数据库中的列定义并为其设置默认值,以防止将来出现空值。
或者不要使用@DiscriminatorColumn
。根据我的经验,它往往会增加更多的复杂性和错误。
答案 1 :(得分:0)
澄清一下:我发现如果您在任何列(例如此处的 KEY1)上设置 @DiscriminatorColumn 注释,Hibernate ORM 会创建一个带有 NOT NULL 约束的数据库模式。由于您的旧数据库具有空值,因此稍后可能会发布一个 ALTER 表以使其成为 NULLABLE。 详细信息:https://hibernate.atlassian.net/browse/HHH-12445
解决方案 1: 您可以使用鉴别器公式将空值映射到首选实体类。
@DiscriminatorFormula("case when key1 is null then 'Contact' else key1 end)
@DiscriminatorValue(value = "Contact")
注意https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html
中的示例 247解决方案:2 您还可以使用 @DiscriminatorColumn("null") 将该行映射到“Contact”实体类。 示例 254 在 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-discriminator-implicit