【发布时间】: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