私はJPAアノテーションのみを使用しており、JPA実装として4.0.1を休止状態にしています。
私Assessment
は2セットのクラスを持っていますComment
:
@Entity
@Table(name = "ASSESSMENT")
public class Assessment{
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> auditComments = new HashSet<Comment>();
@OneToMany(fetch = FetchType.EAGER)
private Set<Comment> comments = new HashSet<Comment>();
}
(ゲッター、セッター、カスケードアノテーション、その他の無関係なコード行はスキップしています)
コメント:
@Entity
@Table(name = "COMMENT")
public class Comment{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(columnDefinition = "text")
private String text;
}
ここで、aにComment
はへの参照がないためAssessment
(これは意図的なものです)、mappedByプロパティを使用できず、Hibernateはとの間にマッピングテーブルを作成する必要がComment
ありAssessment
ます。デフォルトでは、ASSESSMENT_COMMENTという名前です。
のセットが1つしかない場合はComment
、Assessment
問題なく機能します。ASSESSMENT_COMMENTには2つの列しかありません。
[ASSESSMENT_ID, COMMENT_ID]
これは、1対多の関係を完全に表します。
ここに問題があります:
私は1セットではComment
なく2セットを持っているので、Hibernateは1つのASSESSMENT_COMMENTテーブルのみを使用して2セットをマップしようとします。このテーブルには3つの列があります。
[ASSESSMENT_ID, COMMENT_ID, AUDITCOMMENT_ID]
その上、3つの列はnull許容ではないものとして設定されています。
それは確かに機能しません。たとえば、auditComentsに項目が1つだけあり、コメントに項目がない場合、hibernateはCOMMENT_IDにnullを含む1つの行を挿入しようとし、SQL例外を作成します。
質問:
私にはそれはバグのように見えます。1つではなく2つのマッピングテーブルが必要です。
それで、1)それはHibernateの既知のバグですか?2)それを回避する方法はありますか?セットごとに1つずつ、2つのマッピングテーブルをHibernateに作成させることはできますか?(ビジネスロジック要件)Comment
への参照を持つようにクラスを変更できないことに注意してくださいAssessment