我想用 JPA/Hibernate 对两个实体、一个组和一个帐户之间的关系进行建模。一个帐户可以有多个组,但反之则不行,因此我们在帐户和组之间建立了 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
. 根据我的工作同事的说法,这种方法是必要的,因为我们需要从双方更新两个实体之间的双向关系,以确保两个实体的内存模型一致。
但是我相信在构造函数中调用该方法addToAccount
不是一个好主意,因为
List
of s 是延迟获取的Group
,因此调用该方法addToAccount
需要一个打开的事务。所以Group
只能在打开的事务中调用构造函数。在我看来,这是一个非常烦人的限制。作为构造函数的参数给出的
Account
对象Group
由构造函数更改。在我看来,这是构造函数的一个令人惊讶的副作用,Group
不应该发生。
我的建议是更好地使用一个简单的构造函数,比如
public Group(String name, Account account) {
this.name = name;
this.account = account;
}
并手动处理双向关系。但也许我错了。在构建休眠实体时,是否有一种常见的方式来处理双向关系?