Использование оракула автоматического запуска триггера с Hibernate - PullRequest
0 голосов
/ 03 апреля 2012

Я использую hibernate для сопоставления моего класса Java с таблицами оракула.Для моего идентификатора первичного ключа я использую

<generator class="increment"></generator>

Поскольку мой код должен выполняться на двух машинах, я очень часто получаю следующее исключение:

java.util.concurrent.ExecutionException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at jobsrc.BasicDaoImpl.save(BasicDaoImpl.java:65)

Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (DB.SYS_C0011343) violated

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10700)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 18 more

Это потому, что яиспользуя приращение hibernate, он пытается снова набрать последний номер в памяти.Кто-нибудь может показать, как я могу использовать auto_increment оракула в спящем режиме?Я добавляю триггер в базу данных напрямую, но происходит сбой режима гибернации при попытке вызвать saveOrUpdate:

org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at jobsrc.BasicDaoImpl.saveOrUpdate(BasicDaoImpl.java:37)

Caused by: java.sql.BatchUpdateException: No more data to read from socket
at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10700)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 13 more

Большое спасибо !!!!!!!!!

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

У Oracle нет типа auto_increment. Вам следует использовать генератор последовательностей, как показано и объяснено в этом разделе справочного руководства по Hibernate .

0 голосов
/ 27 июня 2012

Hibernate на самом деле может считывать значение, созданное триггером. Есть два способа сделать это:

  1. Используйте генератор org.hibernate.id.SequenceIdentityGenerator. Это работает с функцией getGeneratedKeys в JDBC, а именно с формой, позволяющей присваивать имена возвращаемым столбцам. Это очень непереносимо через базы данных. И, по моему опыту, он даже не переносим во всех версиях драйверов Oracle (хотя я не пробовал много лет)
  2. Используйте генератор org.hibernate.id.SelectGenerator. Это работает путем выбора столбца (столбцов) идентификатора из только что вставленной строки с использованием столбца (столбцов) свойства, определенного как уникальный. Вы либо (а) сконфигурируете генератор, чтобы сообщить ему уникальное свойство, либо (б) если вам случится использовать @ NaturalId / mapping, который используется автоматически.

Однако генераторы идентификаторов «после вставки» (такие как эти два, а также генерация IDENTITY) часто открывают совершенно новую червь с точки зрения подробностей для вашего приложения. Я настоятельно рекомендую не использовать генераторы идентификаторов "post insert". ИМО, вам гораздо лучше, используя генератор последовательностей, как обсуждалось в предыдущем ответе

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