2

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

4

2 回答 2

0

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

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

于 2012-11-08T14:23:34.277 回答
0

只是澄清一下:我发现如果您在任何列上设置 @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”实体类。 https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance-discriminator-implicit中的 示例 254

于 2021-06-14T11:24:33.057 回答