JPA/Hibernate を使用して、グループとアカウントの 2 つのエンティティ間の関係をモデル化したいと考えています。アカウントは複数のグループを持つことができますが、その逆はできないため、アカウントとグループの間には OneToMany の関係があります。Account
私の同僚は、エンティティなどGroup
をモデル化することを提案しました
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;
}
}
と
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;
}
}
私の質問はaddToAccount
、のコンストラクターでのヘルパー メソッドの使用についてですGroup
。私の同僚によると、この方法が必要なのは、2 つのエンティティの一貫したメモリ モデルを確保するために、2 つのエンティティ間の双方向の関係を両側から更新する必要があるからです。
addToAccount
ただし、コンストラクターでメソッドを呼び出すことはお勧めできません。
List
ofGroup
は遅延フェッチされるため、メソッドを呼び出すには 開いaddToAccount
ているトランザクションが必要です。したがって、のコンストラクターはGroup
、開いているトランザクション内でのみ呼び出すことができます。私の意見では、これは非常に厄介な制限です。コンストラクターの引数として指定された
Account
オブジェクトは、コンストラクターGroup
によって変更されます。私の意見では、これはコンストラクターの驚くべき副作用であり、Group
起こるべきではありません。
私の提案は、次のような単純なコンストラクターをより適切に使用することでした
public Group(String name, Account account) {
this.name = name;
this.account = account;
}
双方向の関係を手動で処理します。しかし、多分私は間違っています。休止状態のエンティティを構築するときに双方向の関係を処理する一般的な方法はありますか?