1

1つのエンティティ(1つのテーブルのOneToMany、親-子の関係)でリレーションシップを作成しようとすると、次のクラスがあります。

public class MenuItem {
@Id
@GeneratedValue
private long Id;
private String content;
private String name;

@ManyToOne(cascade = { CascadeType.ALL })
@JoinColumn(name="parent")
private MenuItem parent;

@OneToMany(cascade = CascadeType.ALL, mappedBy="parent")
private Set<MenuItem> childrens  = new HashSet<MenuItem>();

//getters and setters

}

データの読み込みは正常に機能しますが、MenuItemを保存しようとすると、次のエラーが発生します。

「フィールド'childrens_id'にはデフォルト値がありません」

HibernateはMenuItemのcorrest値を保存しようとしますが(ログに表示されます)、別のテーブルに参加して最終的にトランザクションを作成しようとして失敗したと思います。

これは、http://www.roseindia.net/hibernate/hibernate4/OnetoManySelfJoin.shtmlで正確に示されて いますが、機能し ていません。Hibernate4.1.1とTomcatサーバー7を使用しました。

解決済み:データベースを削除して再度作成します。

4

1 に答える 1

1

最良の方法は、データベースを削除して再度実行することです。データベース スキームを生成するために hibernate/jpa impl をセットアップしているようですが、コードとテーブルの同期が大幅にずれています。テーブルに「ぶら下がっている」フィールドがある可能性があります。

補足として:「ワイルド」な推測:@JoinColumn(name="childrens_id")上記のコードに変更する前に試してみましたか?(mappedBy 値と混同されていますか?)

于 2012-05-16T20:00:19.690 に答える