Hibernate save()和事务回滚

在Hibernate中,当我save()在事务中有一个对象,然后回滚它时,保存的对象仍保留在DB中。奇怪,因为使用update()or

delete()方法不会发生此问题,而只会使用save()

这是我正在使用的代码:

DbEntity dbEntity = getDbEntity();

HibernateUtil.beginTransaction();

Session session = HibernateUtil.getCurrentSession();

session.save(dbEntity);

HibernateUtil.rollbackTransaction();

这是 类(只是涉及的函数,我保证该getSessionFactory()方法能正常工作-

有一个Interceptor处理程序,但现在不重要了):

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)。

以上是 Hibernate save()和事务回滚 的全部内容, 来源链接: utcz.com/qa/415498.html

回到顶部