@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=?
Интересно, это известная ошибка, и если у кого-то есть решение?
Ответы
Ответ 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
Проверьте решение производительности, потому что, возможно, слишком медленно для большого объема данных, и если вы можете поделиться, если бы было возможным решением, было бы замечательно знать