我已经创建了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”的用户,并且我在日志文件中遇到hibernate错误。 然后我尝试添加新的唯一用户,使用新的用户名“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]]谢谢。
I've created Hibernate „create” method:
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; } }When some exception occurs (for example, unique constraint in DB), then catch block executes. After one error, I cant create another rows… I get exception about old error. For example, I create user „test”, then I trying add user with same name „test” and I’m getting hibernate error in log file. Then I’m trying to add new unique user, with new username „test2”, but still get old error about „test” user. Where is the problem?
So, real example:
I'm added testuser1@ttt.org, after that, I tryed add this user once more (and gets exception(below))... Now I'm trying to add user "testuser3@ttt.org" but I'm getting this error about testuser1@ttt.org again:
[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]]Thanks.
最满意答案
所以问题出在Session ...每次出错后我都要创建新的Session ...
So, problem was in Session… After each error I must create new Session…
更多推荐
发布评论