2016-07-08 29 views
1

下面的代码不起作用。这个问题是交易没有得到在DB致力于sessionFactory.getCurrentSession()与@Transactional一起工作,但sessionFactory.openSession()不是

案例1:

  @Transactional 
      public void save(Person p) { 
       Session session= sessionFactory.openSession(); 
       session.saveOrUpdate(p); 
       session.close(); 
      } 

,但是当我用下面的代码,然后它是工作的罚款:

案例2:

  @Transactional 
      public void save(Person p) { 
       this.sessionFactory.getCurrentSession().saveOrUpdate(p); 
      } 

查询:

  1. 对于案例1问题,我在谷歌上搜索@Transactional不起作用。但是当我错误地使用案例2时,它开始工作。为什么?

  2. 使用案例2解决方案,当我在Hibernate属性添加以下行之后

    的hibernate.current_session_context_class =线程

它开始给我的错误,那么,交易不活跃。

什么是实际错误?

+0

session.flush();没有写 – PVR

回答

1
  1. 当你打电话给session.saveOrUpdate(p); 你告诉Hibernate更新或添加实体。 但是,相应的记录仍然不存在于底层数据库中。

您需要拨打session.flush()才能将数据库与Hibernate会话同步。

请注意,如果您的程序在没有您致电session.flush()的情况下结束,那么该记录将不会更新。

  • 当用 '线' 配置
  • 的hibernate.current_session_context_class =螺纹

    Hibernate将结合会话从getCurrentSession()返回到当前线程,并且您必须以编程方式管理事务。

    Session session = sessionFactory.getCurrentSession(); 
    session.beginTransaction(); 
    ... 
    //code here 
    ... 
    session.getTransactionCommit(); 
    
    相关问题