0

私は現在Hibernateを学習していますが、この問題に遭遇しました。ユーザー、モジュール、権限の3つのエンティティを定義しました。ユーザーとモジュールの両方がPermissionと1対多の関係にあるため、Permissionの複合IDはidUserとidModuleで構成されます。ユーザークラスには、パーミッションのセットであるプロパティがあり、@ OneToMany、cascade=CascadeType.ALLなどで適切に注釈が付けられています。

ここで、MyEclipseのリバースエンジニアリング機能を使用してクラスを生成しました。権限のIDは、idUserプロパティとidModuleプロパティを持つ個別のクラスとして作成されました。ユーザーを作成し、それにいくつかの新しいアクセス許可を追加できると思いました。したがって、ユーザーを保存すると操作がカスケードされ、アクセス許可が自動的に保存されます。これは、操作によって例外が発生することを除いて当てはまります。次のコードを実行します。

Permission p = new Permission();
p.setId(new PermissionId(null, module.getId());
user.getPermissions().add(p);
session.save(user);

私が抱えている問題は、SQLが正しく生成されていても(最初にユーザーを保存し、次にアクセス許可を保存する)、データベースドライバー(Firebird)からエラーが発生し、idUserにnull値を挿入できないことを示しています。 trueですが、休止状態で新しく作成されたユーザーIDを2番目のクエリに渡す必要はありませんか?

この特定のシナリオは、Null IDを新しいもので作成したいのでPermissionオブジェクトに渡す傾向があるため、非常に直感に反しますが、その一方で、idModuleプロパティを設定する必要があります。モジュールはすでに存在しているので、このような操作がどのように機能するのかよくわかりません。

誰かが私が間違っていることを知っていますか?ありがとう

4

1 に答える 1

0

トランジェントがアタッチされた(まだ保存されていないことを意味する)を保存するときにHibernateが実行するカスケードアクションを指定する必要があります。UserPermission

ちなみに、Permission生成されたID値など、オブジェクトに別のID戦略を使用することを検討することをお勧めしpermissionます。データベース内の行の主キーにnull値を含めるにはどうすればよいでしょうか。

于 2011-10-18T15:39:44.207 に答える