【问题标题】:How to set values treated as NULL in JPA relations如何在 JPA 关系中设置被视为 NULL 的值
【发布时间】:2011-08-29 12:20:56
【问题描述】:

我有一个实体“A”,它与另一个实体“B”具有一对多关系 (1:n)。不幸的是,(多年来存在的)数据库将 B 中的列定义为 A 的主键为 NOT NULL,但这种关系不是强制性的。因此,如果没有 Emtity A 相关,则此列简单地得到 -1。

如何在 JPA / Hibernate 中映射它?我得到以下异常:

Exception in thread "main" 
javax.persistence.EntityNotFoundException: 
Unable to find A with id -1

我知道这是正确的,但也许有解决方法?

请不要因为数据模型而责备我:-)

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    您可以在B.a 属性上使用@NotFound(action = NotFoundAction.IGNORE) 注释。但这仅在阅读关联时才有效。如果您希望能够将B.a 设置为null,并使其在数据库中插入-1 而不是null,我不知道。

    【讨论】:

    • @NotFound 注解有助于加载这些实体及其关系。我现在使用继承来修复 NULL 分配:ExplicitObject.setRelation(relObj) 内部调用 AbstractParent.setRelationId(relObj == null? -1: relObj.getId())。真棒 JPA/Hibernate 如何简化事情 :-)
    【解决方案2】:

    我知道在多年之后将数据模型颠倒过来并不是在公园里散步。特别是因为您必须查看每个附加应用程序的每个角落等等,看看它是否受到影响。这是一个外键,更改它可能会影响很多事情,或者至少在很大程度上影响。

    也就是说,与负责使用某种构造的 DBA 讨论可能仍然值得

    • 保留当前数据模型
    • 让您以不同的方式访问该数据

    Oracle 数据库(最新版本)有一些选项,例如可更新视图和伪列等等。我自己不是 DBA,但我看到了使用伪列的一些潜力,例如,它可以作为外键(朝向表/实体 A)列的副本,但它会

    • 将每个 -1 值显示为 null
    • 确保插入的 null 值在它所指的列中转换为 -1(可能通过使用触发器)

    如果您更改 Hibernate/JPA 设置以使用该列而不是原始列..

    我只希望您拥有一个有一定经验的 DBA,而且更重要的是,不要害怕尝试(当然是在测试环境中)。

    祝你好运! 维姆

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多