Java 两个实体之间可以同时有两个关系吗?(JPA)
例如,我有一个带有两个构造函数的account实体Java 两个实体之间可以同时有两个关系吗?(JPA),java,jpa,Java,Jpa,例如,我有一个带有两个构造函数的account实体 @Entity public class DefaultAccount implements Account { @OneToOne(targetEntity = DefaultManager.class) private Manager manager; public DefaultAccount(String email, String password) { this.email = email;
@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
}
@实体
公共类DefaultManager实现管理器{
@OneToOne(targetEntity=DefaultAccount.class)
私人帐户管理帐户;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“manager”,targetEntity=DefaultAccount.class)
私有集AccountToManager=new HashSet();
public DefaultManager(帐户管理器帐户,设置帐户管理器){
this.managerAccount=managerAccount;
this.accountsToManage.addAll(accountsToManage);
}
//吸气剂
}
上述关系是否有效?如果没有,那么让它工作的最佳替代方案是什么?是的,它会工作,您可以看到带有hibernate的SpringTest 使用JPA需要一个没有参数的构造函数,这个构造函数不需要是
公共的
,它可以是受保护的
此外,您的实体需要一个用@Id
注释的字段。如果您的接口提供了一个@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
)Manager#Account
的引用,将Account
作为目标(Manager#manageAccount->Account#email)您可以更改调用的顺序(
persist
例如,首先是管理器),结果将是具有相同最终结果的不同插入顺序。请确保它可以正常工作。但如果你问这个问题,肯定还涉及到其他问题:为什么你不能测试它?与其问我们这是否有效,为什么你不测试它?为什么它不起作用?不过,要注意循环依赖性。维护它可能是一场噩梦:经理需要帐户才能存在,而帐户需要经理才能存在