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