我有一个脚本来查询我的jboss服务器,这会导致新的hibernate对象被保存。我正在创建model1和model2,调用create on model1,让cascade=“保存-更新”来处理model2。但是,这种方法会导致model2 中的主键约束失败(有时是),在这种情况下hibernate会崩溃。有人知道我该怎么解决这个问题吗?
这是我的地图,还有我得到的错误。由于错误只是在某些时候才发生(而且输入的数据完全是唯一的),我怀疑在会话完全提交之前jboss返回时可能有问题,然后要添加的下一个数据启动并获得它不应该得到的ID。或者对这件事有什么想法?
Model1.hbm.xml
<hibernate-mapping default-cascade="none">
<class name="Model1Impl" table="MODEL1" dynamic-insert="false" dynamic-update="false">
<cache usage="read-write" />
<id name="id" type="java.lang.Long" unsaved-value="null">
<column name="ID" sql-type="NUMBER(19)"/>
<generator class="native">
</generator>
</id>
...
<many-to-one name="Model2" class="Model2Impl" foreign-key="MODEL1_MODEL2_FKC" cascade="save-update" lazy="false" fetch="select">
<column name="MODEL2_FK" not-null="false" sql-type="NUMBER(19)" unique="true"/>
...
</class>
</hibernate-mapping>Model2.hbm.xml
<hibernate-mapping default-cascade="none">
<class name="Model2Impl" table="MODEL2" dynamic-insert="false" dynamic-update="false">
<cache usage="read-write" />
<id name="id" type="java.lang.Long" unsaved-value="null">
<column name="ID" sql-type="NUMBER(19)"/>
<generator class="native">
</generator>
</id>
...
<one-to-one name="Model1" class=Model1Impl" property-ref="Model2" cascade="none" lazy="proxy" fetch="select"/>
</class>
</hibernate-mapping>错误
13:42:15,734 ERROR [JDBCExceptionReporter] ORA-00001: unique constraint (DBSERVER.SYS_C005810470) violated
13:42:15,734 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: could not insert: [Model1Impl]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
...
Caused by: java.sql.SQLException: ORA-00001: unique constraint (DBSERVER.SYS_C005810470) violated
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1986)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1144)
at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2152)非常感谢!
发布于 2011-08-03 23:10:14
事实证明,这个错误,正如应该看到的那样,“无法同步数据库”,是一个数据库问题。
结果我的一个序列被重置了(还不确定是怎么回事),所有的主键都在碰撞。为了解决这个问题,我将我的数据库序列提高到高于我的最高ID。谢谢你的想法,我希望这能帮助那些处于类似情况的人!
发布于 2011-08-02 21:26:46
在Model1上是否有多行指向Model2上的同一行?您的MODEL1_MODEL2_FKC列被声明为唯一的,这将防止这种情况发生。
https://stackoverflow.com/questions/6918709
复制相似问题