私は、Hibernateでのフラッシュに関して異なる動作を示す2つのメソッドを持っています。Hibernate AUTOフラッシュ戦略の注文
@Transactional
public void firstMthod(int id, int status) {
Person entity = session.get(Person.class, id);
entity .setStatus(personStatus.registered);
session.merge(entity);
updatePersonAge(id,18);
}
updatePersonAge
メソッドが別のクラスに位置しており、この方法のSQL出力は次のようになります:
最初のものである
select personel0_.ID as ID1_119_0_,
personel0_.status as status2_119_0_,
personel0_.age as age3_119_0_,
personel0_.CreatedBy as CreatedBy4_119_0_,
personel0_.UpdatedBy as UpdatedBy5_119_0_,
personel0_.CreatedDate as CreatedDate6_119_0_,
personel0_.UpdatedDate as UpdatedDate7_119_0_,
personel0_.Ip as Ip8_119_0_
from tbl_personel personel0_
where personel0_.ID = ?
update tbl_person set status = ? where ID = ?
update tbl_person set age = ? where ID = ?
および第2の使用ケースのために、我々は以下の方法を有する。
@Override
@Transactional
public void secondMethod(int id,int courseId, int status) {
Course courseEntity=session.get(Course .class, courseId);
courseEntity.setCreatedDate(new Date());
session.merge(courseEntity);
updatePersonAge(id,18);
}
updatePersonAge
m ethodは、以下のSQL出力を生成する:
select course0_.ID as ID1_120_0_,
course0_.CreatedBy as CreatedBy7_120_0_,
course0_.UpdatedBy as UpdatedBy8_120_0_,
course0_.CreatedDate as CreatedDate9_120_0_,
course0_.UpdatedDate as UpdatedDate10_120_0_,
course0_.Ip as Ip11_120_0_
from tbl_course course0_
where course0_.ID = ?
update tbl_course set created_date = ? where ID = ?
update tbl_person set age = ? where ID = ?
updatePersoneAge
方法がある:
public int updatePersonAge(int id,int age){
Query query = session.createQuery("update " + domainClass.getName() + " e set e.age= :age ");
query.setParameter("age ", age);
return query.executeUpdate();
}
私の予想によれば、第2の方法の出力は、第1の方法の出力と同じでなければなりません。だから違いは何ですか?それは本当に混乱しています。
"update"コマンドのような更新クエリを取得したブロックトランザクションでは、その行の前に実行されますが、なぜ2番目のメソッドの結果がわからないのかわかりません。 –