java - 2 个实体可以同时拥有 2 个关系吗? (日新社)

标签 java jpa

例如,我有一个包含两个构造函数的帐户实体。

@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=?

地点:

  1. 首先,获取插入管理器的序列(我将属性 Long id 添加到 DefaultManager)。
  2. 它将添加引用经理的三个账户(Account#manager -> Manager#id)。
  3. 插入经理
  4. 更新 Manager#Account 的引用以定位 Account 一个(Manager#manageAccount -> Account#email)。

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

关于java - 2 个实体可以同时拥有 2 个关系吗? (日新社),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25504340/

相关文章:

java - 使用 writer 在 Clojure 中编写 CSV 文件

java - Home按钮不可点击

java - Spring 数据 JPA : Creating Specification Query Fetch Joins

java - JPA EntityManager.getSingleResult() 为 COUNT 查询返回什么?

java - Web 服务和 JPA

java - 使用中间表(中间实体)与两个 ManyToOne 进行 JPA 映射

java - 用抽象类方法解决Java泛型错误

java - 无法在RelativeLayout中使用RecyclerView查看ImageView

java - Android - 条码扫描,选项?志兴?

java - 如何在Hibernate中查询Embedded类?