例如,我有一个包含两个构造函数的帐户实体。
@Entity
public class DefaultAccount implements Account {
@OneToOne(targetEntity = DefaultManager.class)
private Manager manager;
public DefaultAccount(String email, String password) {
this.email = email;
this.password = password;
}
public DefaultAccount(String email, String password, Manager manager) {
this(email, password);
this.manager = manager;
}
// Getters
}
第二个构造函数用于将帐户分配为经理。经理可以管理一组帐户。
@Entity
public class DefaultManager implements Manager {
@OneToOne(targetEntity = DefaultAccount.class)
private Account managerAccount;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "manager", targetEntity = DefaultAccount.class)
private Set<Account> accountsToManage = new HashSet<Account>();
public DefaultManager(Account managerAccount, Set<Account> accountsToManage) {
this.managerAccount = managerAccount;
this.accountsToManage.addAll(accountsToManage);
}
// Getters
}
上述关系是否有效?如果不是,让它发挥作用的最佳替代方案是什么?
最佳答案
是的,它会工作,你可以看到一个 SpringTest with hibernate here .
你需要一个没有参数的构造函数来使用 JPA,这个构造函数不需要是public
,它可以是protected
。
此外,您的实体需要一个用 @Id
注释的字段。如果您的接口(interface)提供了 @Id
getter 方法,您需要将注释(@OneToMany
等)放在具体类的 getter 方法中。
如果你执行测试,你会看到结果:
Hibernate: call next value for man_seq
Hibernate: insert into Test25504340$DefaultAccount (manager_id, password, email) values (?, ?, ?)
Hibernate: insert into Test25504340$DefaultAccount (manager_id, password, email) values (?, ?, ?)
Hibernate: insert into Test25504340$DefaultAccount (manager_id, password, email) values (?, ?, ?)
Hibernate: insert into Test25504340$DefaultManager (managerAccount_email, id) values (?, ?)
Hibernate: update Test25504340$DefaultAccount set manager_id=?, password=? where email=?
地点:
- 首先,获取插入管理器的序列(我将属性
Long id
添加到DefaultManager
)。 - 它将添加引用经理的三个账户(Account#manager -> Manager#id)。
- 插入经理
- 更新
Manager#Account
的引用以定位Account
一个(Manager#manageAccount -> Account#email)。
您可以更改调用的顺序(例如,persirst
首先是管理器),结果将是具有相同最终结果的不同插入顺序。
关于java - 2 个实体可以同时拥有 2 个关系吗? (日新社),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25504340/