2

私はPostgresql上でHibernateとEnvers3.6.10を使用しています。次のように、エンティティAとBOneToManyの間を使用して双方向の関係をマッピングしました。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
}

を介して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の観点からは、これらは2つの一方向の関係であり、偶然にも同じ列にマップされます。

双方向の関係を築くには、@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;

b_idEnversが期待するように、列はnull許容である必要があります。public.a_bテーブルの同じ列のように。問題はDDLジェネレーターに限定されていると思います。

Ato BOneToOne関係は双方向のオプションAあり、所有者です。そのため、b_idnull許容可能であり、主キーがを指すのはそのためPRIMARY KEY(a_id, rev)です。

于 2016-03-30T07:38:55.443 に答える