Спящий режим для многих отношений или списка?
У меня есть много разных отношений на моей Java beans. Когда я использую List
для определения моих переменных:
@Entity
@Table(name="ScD")
public class Group extends Nameable {
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinColumn(name="b_fk")
private List<R> r;
//or
private Set<R> r;
Я получаю эту ошибку:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0'
...
Когда я использую Set
, все выглядит хорошо.
Я хочу спросить, что при использовании многих-многих отношений, которые один для использования для логического консепта List
или Set
(из-за списка могут быть дубликаты и заданы, но что касается производительности и других проблем)?
Ответы
Ответ 1
С точки зрения реляционных баз данных это набор. Базы данных не сохраняют порядок и использование List
бессмысленно, порядок в них не указан (если не использовать так называемые индексированные коллекции).
Использование Set
также имеет большие последствия для производительности. Когда используется List
, Hibernate использует под собой коллекцию PersistentBag
, которая имеет некоторые ужасные характеристики. I.e.: Если вы добавите новые отношения, сначала удалите все существующие, а затем вставьте их обратно + свой новый. С помощью Set
он просто вставляет новую запись.
В-третьих, вы не можете иметь несколько List
в одном объекте, так как вы получите печально известный, не можете одновременно извлекать исключение нескольких пакетов.
См. также:
Ответ 2
Как насчет требования уникальности от Set? Разве эта сила Hibernate не извлекает все объекты каждый раз, когда один добавляется в коллекцию, чтобы убедиться, что новый добавленный уникален? Список не будет иметь этого ограничения.