如何确保@ManyToMany列表的顺序?

时间:2011-09-03 05:42:28

标签: jpa jpa-2.0 eclipselink

考虑:

@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))

我只能在重新启动app / PU之后才能:

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

然而,这个繁琐的代码甚至效率低下,因为它强制在实际需要之前从PU加载E权限。有效的替代方案吗?

2 个答案:

答案 0 :(得分:0)

  

我不能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

答案 1 :(得分:0)

如果您希望维护订单,

JPA还会提供@OrderColumn

See this link

否则,对列表元素顺序的更改不会被视为持久更改。