4

親クラスの ID を子クラスに保存しようとすると、「エラー - フィールド 'parent_id' にデフォルト値がありません」というエラーが表示され続けます。

すべてのタイプのマッピングを試しました。注釈を使用しています。

これに関する任意の助けをいただければ幸いです

親:

      @Id
      @Column(name="id")
      @GeneratedValue(strategy=GenerationType.AUTO)
      private long id;
      @Column(name="description")
      private String description;
      @OneToMany
      @Cascade(value= {org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE})
      @JoinColumn(name="parent_id")
      private List<Child> children;

子:

  @Id
  @Column(name="id")
  @GeneratedValue(strategy=GenerationType.AUTO)
  private long id;
  @Column(name="description")
  private String description;

ありがとう。

4

5 に答える 5

19

誰かが同じ問題に遭遇した場合に備えて、遅れて追加されました。

このエンティティは、Hibernate 4.1.8 を使用して永続化されると、エンティティカスケードしますが、結合列は埋めません。FieldChange

@Entity
public class Event {

    //ID and other fields here

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "event_id")
    private List<FieldChange<?>> fields = new ArrayList<FieldChange<?>>();

 }

挿入ステートメントはevent_id列を設定せず、事後に挿入されたエンティティを更新しません - はevent_idnull のままであり、関係は失われます。

ただし、@JoinColumn定義が次のように変更された場合:

@JoinColumn(name = "event_id", nullable = false)

の場合、挿入ステートメントにはevent_id列が含まれている必要があり、すべて問題ありません。

これは、この特定のバージョンの Hibernate での回帰にすぎない可能性がありますが、誰かの助けになるかもしれません。

于 2012-11-22T15:30:10.883 に答える
8

あなたの場合、子オブジェクトをその親とともに永続化する JPA プロバイダーは、db に対して少なくとも 3 つのクエリを実行します。最初の 2 つは、オブジェクトを独自に永続化します。親を参照する外部キーを持つ最後の更新子オブジェクト。外部キー列に NOT NULL 制約があるため、2 番目のクエリは失敗します。次の 3 つのオプションがあります。

  1. 子エンティティの外部キーに対する NOT NULL 制約を削除します
  2. 双方向の関係を使用する
  3. このようなケースをサポートする JPA プロバイダーに変更してください。
于 2014-06-10T15:06:02.657 に答える
6

これらのマッピングはそのまま機能するため、どこかで何か問題があるに違いありません。彼らはもっと良いかもしれませんが、うまくいくでしょう。具体的には、すべての@Column注釈は冗長で不要です。非 sequitor が指摘したよう@OneToManyに、Hibernate の代わりにJPA の cascade プロパティを使用する必要があります@Cascade。あなたが投稿したもののクリーンアップされたバージョンで実行可能な例を作成しました。git と maven がある場合は、次のコマンドで実行できます。

git clone git://github.com/zzantozz/testbed tmp
cd tmp
mvn -q compile exec:java \
    -Dexec.mainClass=rds.hibernate.UnidirectionalManyToOneJoinColumn \
    -pl hibernate-unidirectional-one-to-many-with-join-column

2 つの子を持つ親を作成し、それらを保存してから、それらをロードしてグラフを出力します。出力は次のとおりです。

Creating parent with two children
Loading saved parent
Parent{description='parent', children=[Child{description='child 2'}, Child{description='child 1'}]}
于 2011-08-14T03:33:08.910 に答える
1

Hibernate 拡張機能ではなく JPA@OneToManyを使用するように変更します@OneToMany(cascade=CascadeType.ALL)

于 2009-11-07T05:21:53.977 に答える
0

私の推測では、割り当てられた@JoinColumn annotationニーズが必要です。referencedColumnName

@JoinColumn(name = "parent_id", referencedColumnName = "id")
于 2010-07-23T15:21:00.880 に答える