2

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

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
}

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

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 需要一些特殊的配置。管理这个?

此致。

4

2 回答 2

2

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

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

于 2013-03-26T20:37:02.037 回答
1

问题是生成的 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;

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

Ato BOneToOne 关系是双向可选的并且A是 owner,这就是为什么b_id可以为空以及为什么主键指向PRIMARY KEY(a_id, rev).

于 2016-03-30T07:38:55.443 回答