gpt4 book ai didi

java - Hibernate save() 和事务回滚

转载 作者:可可西里 更新时间:2023-11-01 06:29:05 25 4
gpt4 key购买 nike

在 Hibernate 中,当我 save() 一个事务中的对象,然后回滚它时,保存的对象仍然保留在数据库中。这很奇怪,因为这个问题不会发生在 update()delete() 方法上,只会发生在 save() 上。

这是我正在使用的代码:

DbEntity dbEntity = getDbEntity();
HibernateUtil.beginTransaction();
Session session = HibernateUtil.getCurrentSession();
session.save(dbEntity);
HibernateUtil.rollbackTransaction();

这里是 HibernateUtil 类(只是涉及的函数,我保证 getSessionFactory() 方法运行良好 - 有一个拦截器处理程序,但它没有现在很重要):

private static final ThreadLocal<Session> threadSession = new ThreadLocal<Session>();
private static final ThreadLocal<Transaction> threadTransaction = new ThreadLocal<Transaction>();

/**
* Retrieves the current Session local to the thread.
* <p/>
* If no Session is open, opens a new Session for the running thread.
*
* @return Session
*/
public static Session getCurrentSession()
throws HibernateException {
Session s = (Session) threadSession.get();
try {
if (s == null) {
log.debug("Opening new Session for this thread.");
if (getInterceptor() != null) {
log.debug("Using interceptor: " + getInterceptor().getClass());
s = getSessionFactory().openSession(getInterceptor());
} else {
s = getSessionFactory().openSession();
}
threadSession.set(s);
}
} catch (HibernateException ex) {
throw new HibernateException(ex);
}
return s;
}

/**
* Start a new database transaction.
*/
public static void beginTransaction()
throws HibernateException {
Transaction tx = (Transaction) threadTransaction.get();
try {
if (tx == null) {
log.debug("Starting new database transaction in this thread.");
tx = getCurrentSession().beginTransaction();
threadTransaction.set(tx);
}
} catch (HibernateException ex) {
throw new HibernateException(ex);
}
}

/**
* Rollback the database transaction.
*/
public static void rollbackTransaction()
throws HibernateException {
Transaction tx = (Transaction) threadTransaction.get();
try {
threadTransaction.set(null);
if ( tx != null && !tx.wasCommitted() && !tx.wasRolledBack() ) {
log.debug("Tyring to rollback database transaction of this thread.");
tx.rollback();
}
} catch (HibernateException ex) {
throw new HibernateException(ex);
} finally {
closeSession();
}
}

谢谢

最佳答案

检查您的数据库是否支持回滚,即如果您使用的是 InnoDB 表而不是 MyISAM(您可以混合使用事务性和非事务性表,但在大多数情况下,您希望所有表都是 InnoDB)。

关于java - Hibernate save() 和事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2605594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com