찾다

 >  Q&A  >  본문

java - Hibernate中清除持久化状态对象失效

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

怪我咯怪我咯2766일 전406

모든 응답(1)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 10:19:40

    공부를 한 후에 문제를 발견했습니다. 그러면 공부하고 있는 다른 친구들에게 도움이 되기를 바랍니다.
    원인: 이 문제는 지속성 클래스의 XXX.hbm.xml에서 정의한 id 생성 전략으로 인해 발생합니다. 저는 identity here 전략을 사용했습니다. 이 전략을 사용하면 session.save() 메서드가 실행되는 즉시 INSERT 문 이 실행됩니다. 이때 개체의 상태에 관계없이 데이터베이스에 대한 이 개체의 업데이트에는 영향을 미치지 않습니다.
    해결책: ID 생성기 전략은 기본 키를 생성하기 위해 데이터베이스에 의존하지 않는 전략을 사용할 수 있습니다.

    자세한 내용은 내 분석을 참조하세요. Hibernate의 기본 키 전략으로 인한 session.evict() 및 session.clear() 실패 아티팩트 분석

    회신하다
    0
  • 취소회신하다