Hibernate& spring无法使数据库状态与会话同步

时间:2012-11-20 10:21:42

标签: hibernate

我收到以下异常

org.hibernate.util.JDBCExceptionReporter - SQL Error: 1, SQLState: 23000
org.hibernate.util.JDBCExceptionReporter - ORA-00001: unique constraint (DBNAME.ConstraintName) violated

org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)

在session.flush()

中指出了错误

请帮助我

我正在使用带有休眠的spring webflow

1 个答案:

答案 0 :(得分:0)

异常明确指出您违反了给定列的唯一约束,这意味着您在2条记录中插入相同的值,这些记录受架构限制。

每个RDBMS都有办法显示您的约束,至少通过DB Dump来实现。或者他们可能有一些额外的语法,比如MySQL,你会写show create table TABLE_NAME。我不知道Oracle中的确切语法。

另外,你需要给你的约束赋予有意义的名字,我希望DBNAME.ConstraintName是你为了举例而改变的,而不是你真正的约束名。在hbm.xml文件中,您可以为简单属性设置unique="true" unique-key="meaningfull_uk",以便了解实际约束失败的原因(您必须重新运行hbm2ddl才能使用新名称重新创建它)。

此外,Session#flush是Hibernate启动的地方,但您需要检查调用此操作的代码,并检查保存实体的可能值可能导致此问题。