Как еще обеспечить порядок списка @ManyToMany? - PullRequest
0 голосов
/ 03 сентября 2011

Рассмотрим:

@Entity
public class M {

    @ManyToMany
    private List<E> es = new ArrayList<E>();
    private E newE;

    public M(E newE) {
        this.newE = newE;
        es.add(newE);
    }

Не могу ли я assert(m.newE == m.getEs(0))?

Я мог бы только если после перезагрузки приложения / ПУ есть:

  public List<E> getEs() {
    final int indexOf = es.indexOf(newE);
    if (indexOf != 0) {
        es.remove(indexOf);
        es.add(0, newE);
    }
    return Collections.unmodifiableList(es);
}

Однако этот обременительный код даже неэффективен, так как он заставляет загружать права E из PU до того, как они действительно могут понадобиться. Любая альтернатива, которая работает?

Ответы [ 2 ]

0 голосов
/ 26 января 2012

JPA также предоставляет @OrderColumn, если вы хотите сохранить заказ.

См. Эту ссылку

В противном случае изменяется порядок элементовсписок не считается постоянным изменением.

0 голосов
/ 25 января 2012

Не могу ли я assert(m.newE == m.getEs(0))?

Нет , если в @ManyToMany есть какие-либо объекты, newE будет добавлено в конец списка. Кроме того, я полагаю, что список будет загружен перед вставкой, поэтому ваше беспокойство по поводу неэффективности не имеет значения.

Если вас беспокоит только порядок элементов при загрузке из модуля персистентности, @ OrderBy поможет вам.

@ManyToMany
@Orderby("someproperty ASC")
private List<E> es = new ArrayList<E>();

Если вы также хотите поддерживать порядок во время выполнения при добавлении элементов, вам придется реализовать compareTo () или отдельный Comparator , затем использовать Collections.sort () , или используйте естественно отсортированную коллекцию, такую ​​как SortedSet .

...