2013-03-25 40 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)