2016-09-18 149 views
1

我下面就Hibernate的教程,看到下面的代码:休眠坚持不交易

package com.websystique.spring.dao; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 

public abstract class AbstractDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    protected Session getSession() { 
     return sessionFactory.getCurrentSession(); 
    } 

    public void persist(Object entity) { 
     getSession().persist(entity); 
    } 

    public void delete(Object entity) { 
     getSession().delete(entity); 
    } 
} 

我在想,如果persist()(或save()delete())而不事务中使用?在这里似乎是这种情况。

+0

我会通过,这是为各种各样的原因非常差代码注意。理想情况下,使用Spring Data JPA(并使用构造函数注入)。 – chrylis

+0

感谢,将调查那些 – Liumx31

回答

1

你不能保存或坚持对象没有事务你必须在保存对象后提交事务否则它不会保存在数据库中。 没有交易,你只能从数据库

+0

所以教程代码不起作用? – Liumx31

1

至于说你不能保存在数据库中的任何事情没有活动的事务检索对象。 它注意到你正在使用一个容器,在这个例子中是Spring。 Spring可以通过像JavaEE这样的interceptos来控制事务。 你可以在这里阅读更多:http://docs.jboss.org/weld/reference/2.4.0.Final/en-US/html/interceptors.html

而且这看起来像一个真正的穷人例子来说明:

public class TransactionalInterceptor { 

    @Inject 
    private Session session; 

    @AroundInvoke 
    public Object logMethodEntry(InvocationContext ctx) throws Exception { 
     Object result = null; 
     boolean openTransaction = !session.getTransaction().isActive(); 
     if(openTransaction) 
      session.getTransaction().begin(); 
     try { 
      result = ctx.proceed(); 
      if(openTransaction) 
       session.getTransaction().commit(); 
     } catch (Exception e) { 
      session.getTransaction().rollback(); 
      throw new TransactionException(e); 
     } 
     return result; 
    } 

}