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

Спящий режим для многих отношений или списка?

У меня есть много разных отношений на моей 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 (из-за списка могут быть дубликаты и заданы, но что касается производительности и других проблем)?

4b9b3361

Ответ 1

С точки зрения реляционных баз данных это набор. Базы данных не сохраняют порядок и использование List бессмысленно, порядок в них не указан (если не использовать так называемые индексированные коллекции).

Использование Set также имеет большие последствия для производительности. Когда используется List, Hibernate использует под собой коллекцию PersistentBag, которая имеет некоторые ужасные характеристики. I.e.: Если вы добавите новые отношения, сначала удалите все существующие, а затем вставьте их обратно + свой новый. С помощью Set он просто вставляет новую запись.

В-третьих, вы не можете иметь несколько List в одном объекте, так как вы получите печально известный, не можете одновременно извлекать исключение нескольких пакетов.

См. также:

Ответ 2

Как насчет требования уникальности от Set? Разве эта сила Hibernate не извлекает все объекты каждый раз, когда один добавляется в коллекцию, чтобы убедиться, что новый добавленный уникален? Список не будет иметь этого ограничения.