java - 为什么需要用 Hibernate 单独保存所有 OneToMany 对象?

标签 java hibernate

考虑一个如下所示的类:

class Person {
  @Column(name = "id")
  Integer id;

  @Column(name = "name")
  String name;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner")
  List <Car> cars;
}

class Car {
  @Column(name = "name")
  String name;

  @Column(name = "plate")
  String plate;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="id", nullable=false)
  Person owner;
}

现在,当我们保存一个 person 对象时:

Transaction tx = session.beginTransaction();   
session.save(person);
for (Car c : person.getCars()) {
  session.save(c);
}
tx.commit();

难道不能只将 java 对象交给 Hibernate 并让它保存所有内容吗?

最佳答案

谢谢阿维德。这正是我所需要的。 为了供将来引用,这是我使用的代码...

class Person {
  @Column(name = "id")
  Integer id;

  @Column(name = "name")
  String name;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "owner", orphanRemoval=true)
  @Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE})
  List <Car> cars;
}

class Car {
  @Column(name = "name")
  String name;

  @Column(name = "plate")
  String plate;

  @ManyToOne(fetch = FetchType.EAGER)
  @JoinColumn(name="id", nullable=false)
  Person owner;
}

唯一真正的区别是,您必须确保在保存父对象之前完成对链接对象的任何更新。

即这是行不通的。

Transaction tx = session.beginTransaction();   
session.save(person);
for (Car c : person.getCars()) {
  c.setName(c.getName() + " Update test");
}
tx.commit();

但这会

Transaction tx = session.beginTransaction();   
for (Car c : person.getCars()) {
  c.setName(c.getName() + " Update test");
}
session.save(person);
tx.commit();

关于java - 为什么需要用 Hibernate 单独保存所有 OneToMany 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39551609/

相关文章:

java - 使用spring jpa获取数据

java - 嵌入式单表映射

java - Android Activity 可以调用自身吗?

java - 运行测试时出现 Cucumber 异常

java - 关系数据库锁定

Java方法重载错误

java - 如何在 Hibernate 中从非实体子类中持久化实体

java - Hibernate ObjectNotFoundException 不一致

java - 正确序列化java中的对象

java - 服务器时区值 'AEST' 无法识别或代表多个时区