2013-03-25 24 views
2

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

类A:B

@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 
} 

类别:

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

此致敬礼。

+0

我可以证实这个问题。 – 2016-03-29 14:04:41

+1

尚未解决,因为您可以在JIRA上看到[HHH-8305](https://hibernate.atlassian.net/browse/HHH-8305) – hespresati 2016-03-30 06:23:44

+0

此错误现已在最新的Hibernate版本中解决。更多关于[JIRA HHH-8305](https://hibernate.atlassian.net/browse/HHH-8305)的信息 – hespresati 2016-06-23 12:57:24

回答

2

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

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

+3

早上好!感谢您的答复。这是我尝试过的一件事,但我总是得到'引起:org.hibernate.MappingException:无法读取com.arplatia.ns.server.prueba.B!'中listB的映射属性。我一直在寻找更多,我发现自3.3.2以来有一个[JIRA](https://hibernate.atlassian.net/browse/HHH-4962),所以似乎我需要将Hibernate更新到最新版本 – hespresati 2013-03-27 08:59:57

+0

'mappedBy'没有帮助。因为我已经运行了4.1.12.Final,所以[HHH-4962](https://hibernate.atlassian.net/browse/HHH-4962)都没有。 – 2016-03-29 14:05:41

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; 

b_id列应可为空的Envers希望它是。就像public.a_b表中的同一列。我相信这个问题仅限于DDL生成器。

AB OneToOne关系是双向可选A是主人,这就是为什么b_id可为空的,为什么主键点PRIMARY KEY(a_id, rev)