【问题标题】:Handling NULL values in @DiscriminatorColumn处理 @DiscriminatorColumn 中的 NULL 值
【发布时间】:2012-11-08 12:13:58
【问题描述】:

我有一个旧的 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”值映射到联系人类?

如果做不到这一点,JPA 中是否有一种机制可以让我预先过滤记录集,让 JPA 相信该字段不是 NULL,但其中写有“联系人”?

【问题讨论】:

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


    【解决方案1】:

    您需要运行更新并将正确的值分配给数据库中具有空值的行。我还建议您修改数据库中的列定义并为其设置默认值,以防止将来出现null。

    或者不要使用@DiscriminatorColumn。根据我的经验,它往往会增加比其价值更多的复杂性和错误。

    【讨论】:

    • 不幸的是,正如我所说,它是一个遗留数据库,我几乎无法控制它,我以只读方式访问它。进行该更新将意味着无休止的重新测试循环。但我想了解更多关于您使用 @DiscriminatorColumn 的经验 - 您会推荐什么?
    • 我建议使用尽可能干净的实体,将一对一映射到表。当您受限于现有的、不灵活的数据模型时,尤其如此。 @Inheritance 并没有真正提供使用简单实体和属性无法实现的任何东西。尝试将关系数据结构硬塞进它不是的东西(多态继承结构)是我从未热衷的事情。
    • 我完全同意 - 但你应该看到这个数据库......它有一个字段来保存字符串,同一个表中的另一个字段保存相同字符串的大写版本。除主键外,所有其他字段都必须“解释”,例如,如果字段是“联系人”,则为电话号码;如果字段为“资产”,则为序列号。使用表继承可以让我正确处理这两种情况——但网络上必须有一个错误配置的客户端设置 NULL——所以即使我更新表,我担心 NULL 会再次开始发生
    【解决方案2】:

    澄清一下:我发现如果你在任何列上设置@DiscriminatorColumn 注释(例如这里的KEY1),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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      相关资源
      最近更新 更多