在@DiscriminatorColumn中处理NULL值

时间:2012-11-08 12:13:59

标签: java orm jpa-2.0 eclipselink single-table-inheritance

我有一个遗留的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但是它中写有“联系人”?

2 个答案:

答案 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”实体类。 示例 254https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-discriminator-implicit