JDO / исключение повторяющейся записи - PullRequest
0 голосов
/ 08 марта 2012

Я получаю MySQLIntegrityConstraintViolationException при сохранении объекта в моей базе данных.Я знаю, что означает эта ошибка, но не могу обойти ее.

Ошибка: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '12345' for key 'PRIMARY'

В основном я хочу сохранить объекты курса в базе данных.Каждый объект курса может иметь несколько объектов пути обучения, которые, в свою очередь, могут быть частью нескольких объектов курса.

Есть ли очевидная ошибка, которую я упускаю?Заранее спасибо!

Обновление (журнал):

DEBUG [DataNucleus.Datastore.Native] - SELECT 'Courses.Studypath' AS NUCLEUS_TYPE, ... FROM `STUDYPATH` `A0` WHERE `A0`.`STUDYPATHID` = <12345> // this one already exists
DEBUG [DataNucleus.Datastore.Retrieve] - Execution Time = 0 ms
DEBUG [DataNucleus.Datastore.Retrieve] - Retrieving PreparedStatement for connection "jdbc:mysql://127.0.0.1/database, UserName=user, MySQL-AB JDBC Driver"

DEBUG [DataNucleus.Datastore.Native] - SELECT 'Courses.Course' AS NUCLEUS_TYPE, ... FROM `COURSE` `A0` WHERE `A0`.`COURSEID` = <1111> // there is no such course, thus it gets created
DEBUG [DataNucleus.Datastore.Retrieve] - Execution Time = 1 ms
DEBUG [DataNucleus.Datastore.Retrieve] - Retrieving PreparedStatement for connection "jdbc:mysql://127.0.0.1/database, UserName=user, MySQL-AB JDBC Driver"
DEBUG [DataNucleus.Datastore.Native] - INSERT INTO `COURSE` (...,`COURSEID`) VALUES (...,<1111>)
DEBUG [DataNucleus.Datastore.Persist] - Execution Time = 1 ms (number of rows = 1)
DEBUG [DataNucleus.Datastore.Retrieve] - Closing PreparedStatement org.datanucleus.store.rdbms.ParamLoggingPreparedStatement@3baac1b5

DEBUG [DataNucleus.Datastore.Persist] - The requested statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" has been made batchable
DEBUG [DataNucleus.Datastore.Persist] - Batch has been added to statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" for processing (batch size = 1)
DEBUG [DataNucleus.Datastore.Persist] - Adding statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" to the current batch (new batch size = 2)
DEBUG [DataNucleus.Datastore.Persist] - Batch has been added to statement "INSERT INTO `STUDYPATH` (...) VALUES (...)" for processing (batch size = 2)
DEBUG [DataNucleus.Datastore.Native] - BATCH [INSERT INTO `STUDYPATH` (...,`STUDYPATHID`) VALUES (...,<12345>); INSERT INTO `STUDYPATH` (...,`STUDYPATHID`) VALUES (<54321>)]
ERROR [DataNucleus.Datastore] - Exception thrown

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Вы можете легко проверить состояние объектов, вызвав JDOHelper.getObjectState (obj).Я настоятельно рекомендую вам, чтобы ваш объект находился в переходном состоянии, а не в состоянии DETACHED, и, скорее всего, потому, что вы не объявили свой класс отключаемым.

1 голос
/ 09 марта 2012

Я не уверен, что кошерно связывать отдельную JDO с временной. У ORM нет простого способа узнать, что это существующий JDO.

Если это действительно тот же путь кода, я бы связал постоянный экземпляр:

c.addStudypath(dbStudypath);

В противном случае я бы сделалPersistent (detachedStudypath) перед его связыванием (при условии, что ваш класс @Detachable)

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