2012-06-06 3 views
1

Я читал за docs относительно поддержки Eclipselink для @OrderColumn. Похоже, это относится только к списку, а не к набору. Причина, по которой я спрашиваю, заключается в том, что у меня есть двунаправленное отношение ManyToMany (с использованием таблицы соединений), которое является Set и реализуется с помощью HashSet, потому что коллекция не может иметь дубликатов.JPA 2.0 Eclipselink OrderColumn support

Я хотел бы заказать записи в этом наборе с помощью @OrderColumn, но, похоже, я могу применить это только к List, однако использование List нарушит мое уникальное требование. Правильно ли это понимание?

Если да, то в чем рекомендуемая стратегия для этого случая?

Спасибо,

-Noah

ответ

1

Это выглядит похоже на следующий вопрос:

Why cannot a JPA mapping attribute be a LinkedHashset?

Интерфейс Set не определяет порядок элементов, так что ваш набор должен быть как реализация TreeSet или LinkedHashSet, а не только старые Set. Но ваш поставщик JPA, как правило, собирается использовать свои собственные реализации коллекции со специальной магией для обработки ленивой загрузки.

Вышеприведенный ответ предполагает, что может возникнуть какое-то временное решение, зависящее от EclipseLink, если вы готовы отказаться от ленивой загрузки.

Я не могу думать о двух вариантов, ни один совершенный:

  • просто использовать List и полагаться на бизнес-логику для обеспечения уникальности, с DB UNIQUE ограничений как обратного хода. Честно говоря, я в конечном итоге использовал List для коллекций почти рефлексивно, даже если Set было бы более подходящим; Я признаю, что это неряшливо, но до сих пор вызывает серьезные проблемы для меня в течение многих лет практики.

  • Используйте Set и изменить @ManyToMany к @OneToMany, и сделать свой стол присоединиться к ж/колонки порядка фактического объекта, который реализует Comparable с помощью колонки заказа. Затем перегружать геттер, чтобы сделать что-то вроде

    if (! this.set instanceof TreeSet) 
        this.set = new TreeSet<T>(this.set); 
    return this.set; 
    
+0

Привет, спасибо за Ваш отзыв. Я в конечном итоге изменил его как List w/@ OrderColumn и обеспечил уникальность в бизнес-логике во время ввода. Sub оптимально, так как теперь требуется вставка, и дополнительный O (n) для проверки дубликатов. Однако пока это единственный путь. Я также оставил единственное ограничение/pk на кортеже двух столбцов FK таблицы соединений. Я также подал запрос об улучшении с помощью Eclipselink: [запрос на улучшение] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=382072) – NBW

Смежные вопросы