Hibernate ConstraintViolationException:无法插入,SQL错误

时间:2011-08-02 21:15:18

标签: java sql hibernate spring jboss

我有一个查询我的jboss服务器的脚本,这会导致保存新的hibernate对象。我正在创建model1和model2,在model1上调用create并让cascade =“save-update”处理model2。但是,这种方法导致模型2中的主键约束失败某些时候,在这种情况下,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)

非常感谢!

2 个答案:

答案 0 :(得分:1)

事实证明,“无法同步数据库”似乎应该出现此错误是数据库问题。

原来我的一个序列被重置(不确定如何)并且各种主键都发生了冲突。为了解决这个问题,我将数据库序列提升到高于最高ID的位置。感谢您的想法,我希望这有助于任何发现自己处于类似情况的人!

答案 1 :(得分:0)

Model1上有多行指向Model2上的同一行吗?您的MODEL1_MODEL2_FKC列被声明为唯一,这将阻止它。