Hibernate ConstraintViolationException: не удалось вставить, ошибка SQL - PullRequest
0 голосов
/ 03 августа 2011

У меня есть скрипт, который запрашивает мой сервер jboss, что приводит к сохранению новых объектов гибернации.Я создаю model1 и model2, вызываю create для model1 и позволяю cascade = "save-update" позаботиться о model2.Однако этот подход приводит к сбою ограничения первичного ключа в модели 2 иногда , и в этом случае гибернация взрывается.У кого-нибудь есть идеи, как я могу это исправить?

Вот мое отображение и ошибка, которую я получаю.Так как ошибка возникает только время от времени (и входящие данные полностью уникальны), я подозреваю, что у меня может быть проблема с возвратом jboss до того, как сессия будет полностью зафиксирована, и затем следующие данные, которые будут добавлены, запускаются и получают идентификаторэто не должноИли есть какие-нибудь мысли по этому поводу?

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 ]

1 голос
/ 04 августа 2011

Оказывается, эта ошибка, как и должно было показаться "Не удалось синхронизировать базу данных", была проблемой базы данных.

Оказывается, одна из моих последовательностей получила сброспока не знаю как) и всякие первичные ключи сталкивались.Чтобы исправить это, я выдвинул последовательность своей базы данных выше, чем мой самый высокий идентификатор.Спасибо за ваши мысли, и я надеюсь, что это поможет любому, кто окажется в подобных ситуациях!

0 голосов
/ 03 августа 2011

У вас есть несколько строк в Model1, указывающих на одну и ту же строку в Model2?Ваш столбец MODEL1_MODEL2_FKC объявлен уникальным, что предотвратит это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...