Hibernate在没有事务的情况下持久化

时间:2016-09-18 09:01:56

标签: java spring hibernate

我正在关注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())?似乎就是这种情况。

2 个答案:

答案 0 :(得分:2)

你不能保存或持久化对象而没有事务,你必须在保存对象后提交事务,否则它不会保存在数据库中。 如果没有交易,您只能从数据库中检索对象

答案 1 :(得分:1)

如上所述,您可以在没有活动交易的情况下保存数据库中的任何内容。 它确定你使用的是容器,在这种情况下是Spring。 Spring可以通过像JavaEE这样的拦截器来控制事务。 您可以在此处阅读更多内容: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;
    }

}