我有一个查询我的jboss服务器的脚本,这会导致保存新的hibernate对象。我正在创建model1和model2,在model1上调用create并让cascade =“save-update”处理model2。但是,这种方法导致模型2中的主键约束失败某些时候,在这种情况下,hibernate会爆炸。有没有人对我如何解决这个问题有任何想法?
这是我的映射,以及我得到的错误。由于错误只在某些时候发生(并且进入的数据都是完全唯一的)我怀疑在会话完全提交之前我可能遇到jboss返回的问题,然后下一个要添加的数据开始并获取一个ID它不应该。或者对此事的任何想法?
<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>
<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)
非常感谢!
答案 0 :(得分:1)
事实证明,“无法同步数据库”似乎应该出现此错误是数据库问题。
原来我的一个序列被重置(不确定如何)并且各种主键都发生了冲突。为了解决这个问题,我将数据库序列提升到高于最高ID的位置。感谢您的想法,我希望这有助于任何发现自己处于类似情况的人!
答案 1 :(得分:0)
Model1上有多行指向Model2上的同一行吗?您的MODEL1_MODEL2_FKC列被声明为唯一,这将阻止它。