0

以下は、コードに実装しようとしているが、それ以上先に進めないシナリオです。この問題のため、過去3日間でスタックしました。

表A、B、C
表A{
colmnnPKA
カラムテスト;

@OneToMany
@Cascade( { org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
@JoinColumn(name = "PKA")
private Collection<TableC> tablec= new ArrayList<TableC>();

}

表B{
列PKB
列test2;
@OneToMany(mappedBy = "tablec",fetch=FetchType.LAZY) @Cascade( { org.hibernate.annotations.CascadeType.ALL,org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) private List tableC= new ArrayList(); //List is used only for Hibernate mapping

}

表c{
列PKC

@ManyToOne @JoinColumn(name = "PKA")private TableA tableA;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PKB",nullable = false,unique=true)
private TableB tableb; 

}

したがって、テーブルCはテーブルAと多対1の関係を持ち、テーブルBとは1対1の関係を持ちます(これは一意によって達成されますが「真」です)

今私の問題は、データを挿入しているときにHibernateが最初にテーブルBデータを挿入し、その後テーブルcデータを挿入しようとして、スローエラーがnull以外の列にNullを挿入できないことです。テーブルCのPkAをnull以外にすると、すべてのデータが適切に挿入されます。.IN休止状態ログでは、SQLステートメントが次の順序
で実行されます。テーブルBテーブルCテーブルA。テーブルCの挿入クエリは最後に実行する必要があります。助けていただければ幸いです。

4

1 に答える 1

0

各種類の関連付けは、Hibernateのドキュメントに例とともに説明されています。ドキュメントを読む必要があります。

とにかく、ここにあなたのマッピングが持っている問題があります。

BとCの間に1対1の関連付けがある場合、使用する注釈はと@OneToOneです@OneToOne@OneToManyとではありません@ManyToOne。そしてもちろん、タイプのフィールドでTableCTableBなく、タイプのフィールドが必要List<TableC>です。

双方向のOneToOneまたはOneToManyアソシエーションがある場合、テーブルに外部キーを含む側が所有者側である必要があります。反対側は挿入側でなければなりません。逆に、mappedBy属性が必要であり、JoinColumn注釈はありません。したがって、TableAでは、TableCとの関連付けは次のように定義する必要があります。

@OneToMany(mappedBy = "tableA")
@Cascade( { org.hibernate.annotations.CascadeType.ALL,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private Collection<TableC> tablec= new ArrayList<TableC>();
于 2012-07-30T15:29:16.437 に答える