调用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应该由持久化状态转为游离状态,期待您的回答!
Après quelques études, j'ai trouvé le problème. Ensuite, posez-le et répondez-y vous-même. J'espère que cela pourra aider d'autres amis qui étudient.
Cause : Ce problème est causé par la stratégie du générateur d'identifiant définie par XXX.hbm.xml dans la classe de persistance que j'ai utilisée identité ici stratégie, l'utilisation de cette stratégie amènera la méthode
session.save()
à émettre une instruction INSERT immédiatement lors de son exécution, quel que soit l'état dans lequel se trouve l'objet, cela n'affectera pas la mise à jour de cet objet dans la base de données.Solution : La stratégie du générateur d'identifiants peut utiliser une stratégie qui ne s'appuie pas sur la base de données pour générer des clés primaires.