@OrderColumn генерирует запрос на обновление первичного ключа - PullRequest
20 голосов
/ 26 мая 2011

Я пользуюсь списком. Список состоит из составного первичного ключа, который также используется для сортировки списка. Проблема в том, что если я удаляю элемент в списке (соединение ключей), аннотация @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=?  

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

Ответы [ 2 ]

1 голос
/ 18 июня 2016

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

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

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

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

Пожалуйста, обратите внимание на предложение, которое гласит:

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

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

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

0 голосов
/ 04 марта 2016

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

@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

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

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