【问题标题】:Rollback transaction in hibernate在休眠中回滚事务
【发布时间】:2014-03-23 13:36:55
【问题描述】:

我已经创建了 Hibernate 的“create”方法:

public PK create(T o) {
    try {

        getSession().beginTransaction();
        PK rez = (PK) getSession().save(o);
        getSession().flush();
        getSession().getTransaction().commit();
        return rez;
    }
    catch (Exception e){
        e.printStackTrace();
        getSession().getTransaction().rollback();
        return null;
    }

}

当某些异常发生时(例如,DB 中的唯一约束),就会执行 catch 块。出现一个错误后,我无法创建另一行……我收到有关旧错误的异常。例如,我创建用户“test”,然后尝试添加具有相同名称的用户“test”,并且在日志文件中出现休眠错误。然后我尝试使用新用户名“test2”添加新的唯一用户,但仍然收到关于“test”用户的旧错误。问题出在哪里?

所以,真实的例子:

我添加了 testuser1@ttt.org,之后,我尝试再次添加此用户(并得到异常(如下))......现在我正在尝试添加用户“testuser3@ttt.org”但是我再次收到有关 testuser1@ttt.org 的错误:

[2014-03-23T17:35:17.767+0200] [glassfish 4.0] [WARN] [] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] [tid: _ThreadID=22 _ThreadName=http-listener-1(5)] [timeMillis: 1395588917767] [levelValue: 900] [[
  SQL Error: 0, SQLState: 23505]]

[2014-03-23T17:35:17.767+0200] [glassfish 4.0] [ERROR] [] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] [tid: _ThreadID=22 _ThreadName=http-listener-1(5)] [timeMillis: 1395588917767] [levelValue: 1000] [[
  ERROR: duplicate key value violates unique constraint "unique_Username"
  Detail: Key (username)=(testuser1@ttt.org ) already exists.]]

[2014-03-23T17:35:17.767+0200] [glassfish 4.0] [SEVERE] [] [] [tid: _ThreadID=22 _ThreadName=Thread-4] [timeMillis: 1395588917767] [levelValue: 1000] [[
  org.hibernate.exception.ConstraintViolationException: could not execute statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136)
    at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3067)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3509)
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:286)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:339)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234)
    at org.test.majas.dao.GenericDaoImpl.create(GenericDaoImpl.java:29)
    at org.test.majas.beans.TestBean.addUser(TestBean.java:80)
    .....
Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "unique_Username"
  Detail: Key (username)=(testuser1@ttt.org ) already exists.
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2161)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1890)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:560)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:363)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
    ... 63 more]]

谢谢。

【问题讨论】:

  • 问题是异常的堆栈跟踪告诉你它在哪里。怎么不发呢?
  • 所以,抱歉,现在添加。
  • 有什么想法吗? :(请帮忙。

标签: hibernate exception transactions


【解决方案1】:

所以,问题出在 Session 中……每次出现错误后我都必须创建新的 Session……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-18
    • 2013-08-18
    • 2011-06-23
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多