【问题标题】:JPA - updating objects in OneToMany-RelationsJPA - 更新 OneToMany-Relations 中的对象
【发布时间】:2013-06-16 21:28:02
【问题描述】:

好吧,我有点困惑,因为我找不到任何解决问题的方法(也许是某种停电)

假设我有以下(简化的)实体:

@Entity
public class Employee {
    @Id
    private long id;
    @OneToMany(mappedBy="owner")
    private Collection<Phone> phones;
}

@Entity
public class Phone {
    @Id
    private long id;
    @ManyToOne
    private Employee owner;
}

我有一个由 JPA 管理的 phone 对象。现在我想用类似的东西改变那个 phone 对象的 Employee:

phone.setEmployee(otherEmployee);

我认为 JPA 会更新相应的 Employee 也会更新。我错了吗? 我尝试了注释 @ManyToOne 和 @OneToMany (cascade = CascadeType.ALL, orphanRemoval = true),但它不起作用。

我必须自己更新 Employee 对象吗?不幸的是,我在任何教程或其他示例中都没有找到这种情况,所以我希望你能告诉我更多,我很困惑。提前致谢。

编辑使其更清晰:

Phone phone = new Phone();
Employee employee = new Employee();
phone.setEmployee(employee);
em.persist(employee);
em.persist(phone);

employee.getPhones(); //the phone object should be included here.

【问题讨论】:

  • 既然你没有删除,CascadeType.REMOVE 对你没有任何好处。尝试改用CascadeType.PERSIST 或CascadeType.ALL。另外,我认为您在更改 Employee 关系后保存了 phone 对象,对吧?
  • 没错,我有 CascadeType.ALL,但不幸的是,这不是解决方案(为了清楚起见,我现在对其进行了编辑)。 手机及其所有者已保存在数据库中,并由em.find(...) 读取。现在我想改变所有者。 (当然相应的 Employee-object 也应该更新)
  • 那么在将所有者更改为另一个Employee 对象后,您是否调用了 em.merge(phone);?
  • 我再次编辑了问题。在 cmets 中格式化很复杂 ;)

标签: java jpa


【解决方案1】:

这个link 是您问题的答案,您应该自己管理关系,即。 e.:

class Phone {
...
   void setEmployee(Employee employee) {
      owner = employee;
      employee.addPhone(phone);
   }
...
}

【讨论】:

  • 好吧,这是有道理的。我认为它将由 JPA 本身管理。谢谢!
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多