【问题标题】:Hibernate persist without transaction休眠持续无事务
【发布时间】:2016-09-18 09:01:56
【问题描述】:

我正在关注 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())是否可以在没有事务的情况下使用?就像这里的情况一样。

【问题讨论】:

  • 我会顺便指出,由于各种原因,这是非常糟糕的代码。理想情况下,使用 Spring Data JPA(并使用构造函数注入)。
  • 谢谢,会调查这些
  • 没有事务就无法持久。请查看您的休眠配置文件。它应该通过拦截器提供交易

标签: java spring hibernate


【解决方案1】:

你不能在没有事务的情况下保存或持久化对象,你必须在保存对象后提交事务,否则它不会保存在数据库中。 没有事务你只能从数据库中检索对象

【讨论】:

    【解决方案2】:

    如前所述,如果没有活动的事务,您将无法在数据库中保存任何内容。 它看到您正在使用一个容器,在本例中是 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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 2013-11-28
      • 2018-05-06
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多