0

我正在尝试更新事务中的实体,首先我使用其主键选择实体,然后延迟加载其子实体并通过 setter 方法对其属性进行更改。之后,当我合并父对象时,它的所有具有 OneToMany 关系的子对象都会自动更新。虽然这是必需的功能,但我对这种行为有点困惑,因为我没有为子实体指定任何级联选项。为了确保,我什至尝试了一个非关系表,只是使用 find JPAQL 查询并更改了它的属性。当主实体合并操作后提交事务时,该非关系实体也与其他实体一起更新。我不确定这是正确的行为,

我的家长班

class Student
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id", nullable = false)
private Integer id;

private String name;
@OneToMany(mappedBy = "student")
private List<Subjects> subjects;

public Integer getId(){
return id;
}
public void setId(Integer id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}

我的孩子班

Class Subjects

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id", nullable = false)
private Integer id;

@JoinColumn(name = "student", referencedColumnName = "id", nullable = false)
@ManyToOne(optional = false)
private Student student;

public Integer getId(){
return id;
}
public void setId(Integer id){
this.id=id;
}

public String getCourse(){
return course;
}
public void setCourse(String course){
this.course=course;
}

非关系实体只是一个实体类,与此选定的实体类没有任何关系。我添加它只是为了检查更新是否由于实体类中指定的任何关系而发生(即使没有级联选项)。

我的事务更新功能。

    Object obj1 = this.transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {

Category category=findById('2'); //Non-Related entity with Student or Subject
category.setName('new category');

Student student=findStudentById(1);
for(Subjects subjects:student.getSubjects()){
subjects.setCourse("test");
}
student.setName("student1");
entityManager.merge(student);

   return true;
   }
 });

所以合并和事务提交后的最终结果是,所有表(学生、学科和类别)都更新了。

4

1 回答 1

3

好的,所以您很惊讶对实体所做的更改甚至无需调用merge()或任何其他方法即可持久保存。

这是 JPA/Hibernate 和附加实体的要点之一:您修改它们,并且由于它们附加到持久性上下文,所有这些更改在需要时(最多在事务结束时)透明地持久化。

merge()用于将分离实体的状态复制到附加实体。

阅读文档的这一部分以获取更多详细信息。

于 2013-08-22T10:23:49.373 回答