5

私は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つしかない場合はCommentAssessment問題なく機能します。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

4

1 に答える 1

8

まず、コメントテーブルの2つの列を使用して、評価を示すことができます。

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "audit_commented_assessment_id")
private Set<Comment> auditComments = new HashSet<Comment>();

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "commented_assessment_id")
private Set<Comment> comments = new HashSet<Comment>();

2つの結合テーブルが必要な場合は、次のように言ってください。

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "assessment_audit_comment",
           joinColumns = @JoinColumn(name = "assessment_id"),
           inverseJoinColumns = @JoinColumn(name = "comment_id"))
private Set<Comment> auditComments = new HashSet<Comment>();

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "assessment_comment",
           joinColumns = @JoinColumn(name = "assessment_id"),
           inverseJoinColumns = @JoinColumn(name = "comment_id"))
private Set<Comment> comments = new HashSet<Comment>();

もちろん、それはドキュメントで説明されています。

于 2012-12-14T10:38:17.857 に答える