调用session.clear()
或者session.evict(obj)
皆无法清除Hibernate中的持久化状态的对象
目前已知的情况是:
当主键使用identify策略时,
session.save(person)
调用完成后会发出INSERT语句当主键使用increment策略时,不会发出INSERT语句,并且结果与预期一致
代码如下:
@Test
public void test1(){
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Person person = new Person();
person.setName("tom888");
session.save(person); //此处是否发出**INSERT**语句与主键策略有关
session.evict(person);
// session.clear();
transaction.commit();
session.close();
}
主键使用identify策略时,代码执行结果:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into Person (name, description) values (?, ?)
我期待的结果应该是数据不应该有任何变化才对,也不应该执行任何SQL语句,因为我调用了session.clear()
或者session.evict(obj)
时,person应该由持久化状态转为游离状态,期待您的回答!
Setelah belajar, saya jumpa masalahnya kemudian tanya dan jawab sendiri.
Punca: Masalah ini disebabkan oleh strategi penjana id yang ditakrifkan oleh XXX.hbm.xml dalam kelas kegigihan yang saya gunakan identiti di sini strategi, menggunakan strategi ini akan menyebabkan kaedah
session.save()
mengeluarkan kenyataan INSERT dengan serta-merta apabila ia dilaksanakan Pada masa ini, tidak kira dalam apa keadaan objek itu, ia tidak akan menjejaskan kemas kini objek ini ke pangkalan data.Penyelesaian: Strategi penjana id boleh menggunakan strategi yang tidak bergantung pada pangkalan data untuk menjana kunci utama.