【问题标题】:Envers inserting null Id in bidirectional OneToMany with JoinTableEnvers 使用 JoinTable 在双向 OneToMany 中插入空 Id
【发布时间】:2013-03-15 04:14:24
【问题描述】:

我在 Postgresql 上使用 Hibernate 和 Envers 3.6.10。我在实体 A 和 B 之间使用JoinTable 映射了OneToMany 双向关系,如下所示。

A 类:

@Entity
@Audited
public class A {
    // Other stuff

    @OneToMany()
    @Cascade(CascadeType.ALL)
    @LazyCollection(LazyCollectionOption.TRUE)
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_ID") }, inverseJoinColumns = { @JoinColumn(name = "B_ID") }) 
    private Set<B> setOfBs;

    // Getters + Setters + HashCode + Equals
}

B 类:

@Entity
@Audited
public class B {
    // Other stuff

    @ManyToOne(optional=true)
    @LazyCollection(LazyCollectionOption.TRUE)
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "B_ID") }, inverseJoinColumns = { @JoinColumn(name = "A_ID") })
    private A a;

    // Getters + Setters + HashCode + Equals
}

通过save() 持久化具有一组 B 的 A 实体没有问题。即使没有明确设置 B 和 A 之间的双向关系。当 Envers 进行插入以将修订保存在 JoinTable aud 表中时出现此异常:

Hibernate: insert into a_b_AUD (a_id, b_id, REV) values (?, ?, ?)
16:27:38,051 TRACE BasicBinder:70 - binding parameter [1] as [BIGINT] - <null>
16:27:38,051 TRACE BasicBinder:82 - binding parameter [2] as [BIGINT] - 2038
16:27:38,051 TRACE BasicBinder:82 - binding parameter [3] as [INTEGER] - 2039
16:27:38,056  WARN JDBCExceptionReporter:233 - SQL Error: 0, SQLState: 23502
16:27:38,056 ERROR JDBCExceptionReporter:234 - ERROR: null value in column «a_id» violates not null restriction

如果我在 Hibernate 中设置完整的调试模式,我可以看到 Envers“知道”该 Id,但没有将其传递给插入。我该如何解决这个问题?关系是否正确映射? Envers 需要一些特殊的配置。管理这个?

最好的问候。

【问题讨论】:

  • 我可以确认这个问题。
  • 如您在 JIRA HHH-8305 上看到的,它尚未解决
  • 这个错误现在在最新的 Hibernate 版本中得到解决。更多信息JIRA HHH-8305

标签: hibernate hibernate-envers


【解决方案1】:

这可能是 Envers 中的一个错误,因为它是一种非常不典型的映射关系的方式。事实上,从 Hibernate 的角度来看,这是两个单向关系,它们被映射到相同的列。

要建立双向关系,您需要在 @OneToMany 中使用“mappedBy”。

【讨论】:

  • 早上好!感谢您的答复。这是我尝试过的事情之一,但我总是得到Caused by: org.hibernate.MappingException: Unable to read the mapped by attribute for listB in com.arplatia.ns.server.prueba.B!。我一直在寻找更多,我只是发现自 3.3.2 以来有一个JIRA 所以看来我需要将 Hibernate 更新到最新版本
  • mappedBy 没有帮助。 HHH-4962 也没有,因为我已经在运行 4.1.12.Final。
【解决方案2】:

问题是生成的DDL:

CREATE TABLE public.a_b_aud (
  b_id BIGINT NOT NULL, 
  rev INTEGER NOT NULL, 
  a_id BIGINT NOT NULL, 
  CONSTRAINT a_b_aud_pkey PRIMARY KEY(a_id, rev), 
  CONSTRAINT fk_5689e745b66c4ee2a8822e44079 FOREIGN KEY (b_id, rev)
    REFERENCES public.b_aud(id, rev)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE, 
  CONSTRAINT fk_b5c868c4f5f34d35bdb7a6c1281 FOREIGN KEY (a_id, rev)
    REFERENCES public.a_aud(id, rev)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    NOT DEFERRABLE
) WITHOUT OIDS;

b_id 列应该可以为空,正如 Envers 所期望的那样。就像public.a_b 表中的同一列一样。我认为问题仅限于 DDL 生成器。

AB OneToOne 关系是双向可选A 是所有者,这就是为什么b_id 可以为空以及为什么主键指向PRIMARY KEY(a_id, rev)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 2016-05-16
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多