Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两个实体之间可以同时有两个关系吗?(JPA)_Java_Jpa - Fatal编程技术网

Java 两个实体之间可以同时有两个关系吗?(JPA)

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;

例如,我有一个带有两个构造函数的account实体

@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
  • 它将添加引用经理的三个帐户(帐户#经理->经理id)
  • 插入经理
  • 更新
    Manager#Account
    的引用,将
    Account
    作为目标(Manager#manageAccount->Account#email)

  • 您可以更改调用的顺序(
    persist
    例如,首先是管理器),结果将是具有相同最终结果的不同插入顺序。

    请确保它可以正常工作。但如果你问这个问题,肯定还涉及到其他问题:为什么你不能测试它?与其问我们这是否有效,为什么你不测试它?为什么它不起作用?不过,要注意循环依赖性。维护它可能是一场噩梦:经理需要帐户才能存在,而帐户需要经理才能存在