2010-08-29 2 views
4

Я получаю ниже упомянутую трассировку стека, хотя данные вставляются успешно.org.hibernate.exception.ConstraintViolationException: Не удалось выполнить пакетное обновление JDBC.

Hibernate: select attendee_.attendeeId, attendee_.attendeeName as attendee2_1_ from attendee attendee_ where attendee_.attendeeId=? 
Hibernate: select attendee_.attendeeId, attendee_.attendeeName as attendee2_1_ from attendee attendee_ where attendee_.attendeeId=? 
Hibernate: insert into event (eventName, startDate, eventId) values (?, ?, ?) 
Hibernate: insert into attendee (attendeeName, attendeeId) values (?, ?) 
Hibernate: insert into attendee (attendeeName, attendeeId) values (?, ?) 
Hibernate: update attendee set attendeeId=? where attendeeId=? 
Hibernate: update attendee set attendeeId=? where attendeeId=? 
Aug 29, 2010 7:39:10 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
WARNING: SQL Error: 1062, SQLState: 23000 
Aug 29, 2010 7:39:10 PM org.hibernate.util.JDBCExceptionReporter logExceptions 
SEVERE: Duplicate entry '11' for key 'PRIMARY' 
Aug 29, 2010 7:39:10 PM org.hibernate.event.def.AbstractFlushingEventListener performExecutions 
SEVERE: Could not synchronize database state with session 
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980) 
    at com.practice.hibernate.basic.BasicOperations.main(BasicOperations.java:51) 
Caused by: java.sql.BatchUpdateException: Duplicate entry '11' for key 'PRIMARY' 
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) 
    ... 6 more 
Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:144) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980) 
    at com.practice.hibernate.basic.BasicOperations.main(BasicOperations.java:51) 
Caused by: java.sql.BatchUpdateException: Duplicate entry '11' for key 'PRIMARY' 
    at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:665) 
    at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195) 
    ... 6 more 

Обратите внимание:

а) Моя БД не имеет записей в настоящее время б) данные получает вставленные в БД успешно.

Здесь я пытаюсь сохранить объект Event, который содержит два объекта Attendee. Вот и все.

Мой тест:

public static void main(String[] args) { 
    Session session = HibernateRuntime.getSession(); 

    try { 
     Set<Attendee> attendees = new HashSet<Attendee>(2); 

     Attendee attendee = new Attendee(); 
     attendee.setAttendeeId(3); 
     attendee.setAttendeeName("Baswanth Rao"); 

     Attendee attendee1 = new Attendee(); 
     attendee1.setAttendeeId(4); 
     attendee1.setAttendeeName("Razi Ahmed"); 

     attendees.add(attendee); 
     attendees.add(attendee1); 

     Event event = new Event(); 
     event.setEventId(11); 
     event.setEventName("Initiatives Workshop 3"); 
     event.setStartDate(new Date()); 
     event.setAttendees(attendees); 

     session.save(event); 
     session.flush(); 

    } finally { 
     session.close(); 
    } 
} 

Event.hbm.xml:

<hibernate-mapping package="com.practice.hibernate.vo"> 
    <class name="Event" table="event"> 
     <id name="eventId" column="eventId" type="long"> 
      <generator class="assigned" /> 
     </id> 

     <property name="eventName" type="string" length="100" /> 
     <property name="startDate" type="date" /> 

     <set name="attendees" cascade="all"> 
      <key column="attendeeId" /> 
      <one-to-many class="Attendee" /> 
     </set> 
    </class> 
</hibernate-mapping> 

hibernate.cfg.xml

<hibernate-configuration> 
    <session-factory> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost/test</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password"></property> 
     <property name="connection.autocommit">false</property> 

     <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="show_sql">true</property> 

     <mapping resource="com/practice/hibernate/vo/Event.hbm.xml"></mapping> 
     <mapping resource="com/practice/hibernate/vo/Attendee.hbm.xml"></mapping> 
    </session-factory> 
</hibernate-configuration> 
+0

удалить зависимость в очном и попробовать еще раз. или дважды проверьте свой Attendee.hbm.xml – mhshams

+0

, вы уверены, что тестовый код работает только 1 раз? Вы можете поместить некоторый журнал в свой основной метод, чтобы убедиться, что он только что выполнил один из них. – mhshams

+0

Bashu, используйте ссылку «Изменить», чтобы добавить это в вопрос.Это находится в левом нижнем углу текста вашего вопроса, чуть ниже кнопки для тега спящего режима. – meriton

ответ

11

Ваш Даже t.hbm.xml говорит:

<set name="attendees" cascade="all"> 
    <key column="attendeeId" /> 
    <one-to-many class="Attendee" /> 
</set> 

На простом английском языке это означает, что столбец Attendee.attendeeId является внешний ключ для ассоциации attendees и указывает на первичный ключ Event.

Когда вы добавляете этих участников в событие, hibernate обновляет внешний ключ, чтобы выразить измененную связь. Поскольку этот же столбец также является первичным ключом Attendee, это нарушает ограничение первичного ключа.

Поскольку индивидуальность участника и участие в мероприятии независимы, вы должны использовать отдельные столбцы для основного и внешнего ключей.

Редактировать: выбор может быть вызван тем, что у вас нет настроенного свойства версии, что делает невозможным для hibernate знать, существуют ли участники в базе данных (они могли быть загружены в предыдущий сеанс) поэтому спящий режим выдает выбор для проверки. Что касается операторов обновления, было бы, вероятно, проще реализовать этот путь. Если вы хотите избавиться от этих отдельных обновлений, я рекомендую сопоставить ассоциацию с обоих концов и объявить Event -end как inverse.

+0

Да, это проблема, у вас должна быть другая колонка в таблице вашего участника – mhshams

+0

Да ... спасибо Меритону. Проблемы решены сейчас ... Мне жаль, что это была основная проблема, я должен был ее полностью проверить. – Bashu

+0

Не могли бы вы также объяснить, почему выполняются первые 2 выбора и последние 2 обновления. Не могли бы мы избежать этих двух утверждений обновления? – Bashu

-2

Вам может понадобиться обработать javax.persistence.RollbackException

Смежные вопросы