java - Hibernate中清除持久化状态对象失效
怪我咯
怪我咯 2017-04-18 10:17:40
0
1
405

调用session.clear()或者session.evict(obj)皆无法清除Hibernate中的持久化状态的对象

目前已知的情况是:

  1. 当主键使用identify策略时,session.save(person)调用完成后会发出INSERT语句

  2. 当主键使用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应该由持久化状态转为游离状态,期待您的回答!

怪我咯
怪我咯

走同样的路,发现不同的人生

membalas semua(1)
Ty80

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.

Untuk butiran, sila lihat analisis saya: Analisis artifak kegagalan session.evict() dan session.clear() yang disebabkan oleh strategi utama utama dalam Hibernate

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!