Hibernate 无需事务即可持久保存

问题描述 投票:0回答:3

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

java spring hibernate
3个回答
6
投票

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


2
投票

实际上,可以在不使用 Hibernate 进行事务的情况下进行持久化,但由于性能和数据一致性问题,强烈建议不要这么做。

application.properties

hibernate.allow_update_outside_transaction=true

春天
application.properties

spring.jpa.properties.hibernate.allow_update_outside_transaction=true

有关更多信息,
请参阅休眠中的可用设置

因为我必须出于非常具体的原因使用此设置。我认为它可能对某些人有用,尽管不建议在生产代码中使用它。


1
投票
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; } }

	
© www.soinside.com 2019 - 2024. All rights reserved.