JPA/Hibernateを使ってグループとアカウントの2つのエンティティ間の関係をモデル化したいと思います。アカウントはいくつかのグループを持つことができますが、その逆もありません。そのため、アカウントとグループの間にOneToMany関係があります。 私の作業の同僚は、私の質問はGroup
のコンストラクタでのヘルパーメソッドaddToAccount
の使い方について今ある 休止状態のエンティティを構築するときに双方向関係を処理する方法は?
と
public class Group {
private String name;
private Account account;
public Group() {}
public Group(String name, Account account) {
this.name = name;
addToAccount(account);
}
public void addToAccount(Account account) {
setAccount(account);
List<Group> accountGroups = account.getGroups();
accountGroups.add(this);
}
@ManyToOne
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
}
public class Account {
private List<Group> groups = new ArrayList<Group>();
public Account() {}
public void setGroups(List<Group> usergroups) {
this.groups = groups;
}
@OneToMany(mappedBy = "account")
public List<Group> getGroups() {
return groups;
}
}
のようなエンティティ
Account
と
Group
をモデル化することが示唆されました。私の仕事の同僚によると、この方法は、2つのエンティティの一貫したメモリモデルを保証するために、両方のエンティティ間の双方向の関係を更新する必要があるため必要です。
Group
SのList
はとてもオープン トランザクションを必要とaddToAccount
方法 を呼び出し、遅延し フェッチされるので私はコンストラクタでメソッド
addToAccount
を呼び出すと信じてしかしは、良いアイデアではありません。したがって、Group
のコンストラクタは、 オープントランザクション内でのみ呼び出すことができます。私の意見では、これは非常に迷惑な制限です。Group
のコンストラクタへの引数として与えられたAccount
オブジェクトはコンストラクタによって を変化させます。私の意見では、これは のコンシューマーGroup
の驚くべき副作用であり、起こるべきではありません。
私の提案は、より良い
public Group(String name, Account account) {
this.name = name;
this.account = account;
}
のような単純なコンストラクタを使用して、手動で双方向の関係に対処することでした。しかし、多分私は間違っています。休止状態のエンティティを構築するときに双方向関係を処理する方法は共通していますか?
私はそれがあなたの大学が提案していた悪い習慣だと信じています。上記のうち1つまたは2つ(特に2!)だけでなく、コンストラクタ内でオーバーライド可能なメソッドを使用する必要があります。これは、サブクラスでうまく上書きされ、子オブジェクトコンストラクタが呼び出される前に呼び出される可能性があります。私はあなたが一貫したオブジェクトグラフ(メモリモデル)を維持すべきだと私は信じています、私は今、それを最善を尽くす方法について研究しています。ようやく答えに出ますか? – Victor