Подтвердить что ты не робот

@OrderColumn генерирует запрос на обновление первичного ключа

Я использую список. Список состоит из составного первичного ключа, который также используется для сортировки списка. Проблема в том, что если я удалю элемент в списке (ключевое слово), аннотация @OrderColumn генерирует запрос на обновление первичного ключа, а стоимость вызывает исключение типа:

[26-05-2011 10:34:18:835] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 1062, SQLState: 23000  
[26-05-2011 10:34:18:835] ERROR org.hibernate.util.JDBCExceptionReporter  -Duplicate  entry '10-10' for key 'PRIMARY'  
[26-05-2011 10:34:18:835] ERROR org.hibernate.event.def.AbstractFlushingEventListener  - Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update  

Вот определение отображения:

@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "chapter_item", joinColumns = { @JoinColumn(name = "chapter_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "item_id", nullable = false, updatable = false) })
@OrderColumn(name="iorder")
public List<Item> getItems() {
    return items;
}

Вот запрос на обновление, где у меня проблема:

Hibernate: 
update
    chapter_item 
set
    item_id=? 
where
    chapter_id=? 
    and iorder=?  

Интересно, это известная ошибка, и если у кого-то есть решение?

4b9b3361

Ответ 1

Что касается @OrderColumn, следующая документация находится в http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html

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

Итак, мы видим, что поставщик сохранения, т.е. hibernate, отвечает за обновление столбца с именем iorder. Также говорится, что:

Аннотации OrderColumn указываются в OneToMany или ManyToMany отношения или коллекции элементов. Аннотации OrderColumn указывается на стороне отношения, которое ссылается на которая должна быть заказана. Столбец заказа не отображается как часть состояния объекта или внедряемого класса.

Обратите внимание на предложение, в котором говорится:

Столбец заказа не отображается как часть состояния объекта или вложенный класс.

Итак, могу ли я предложить вам не выбирать столбец iorder для @OrderColumn, так как он является частью вашего composite key, а спящий режим обязательно обновляет это значение при удалении или вставке элемента в список (List<Item>).

Надеюсь, это поможет.

Ответ 2

Возможно, одним из вариантов может быть изменение аннотации заказа и использование:

@ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "chapter_item", joinColumns = { @JoinColumn(name =     "chapter_id", nullable = false, updatable = false) }, inverseJoinColumns =  {@JoinColumn(name = "item_id", nullable = false, updatable = false) })
@org.hibernate.annotations.Sort(type = SortType.COMPARATOR, comparator = ItemComparator)
public List<Item> getItems() {
return items;
}

https://dzone.com/articles/sorting-collections-hibernate

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