JPA(EclipseLink)列表顺序

时间:2014-06-23 08:22:34

标签: java jpa eclipselink

在使用EclipseLink时,在持久性期间保持列表顺序时遇到一些问题。我是否遗漏了EclipseLink中的某些设置,或者忘记使用某些注释?

我有两个看起来像这样的类:

@Entity
@Table(name = "sequence")
public final class Sequence {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(cascade = CascadeType.PERSIST, mappedBy = "sequence")
    private List<Run> runs;

    // Other fields
    // ...
}

@Entity
@Table(name = "run")
public final class Run {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "seq_id", nullable = false)
    private Sequence sequence;

    @Column(nullable = false)
    private String comment;

    // Other fields
    // ...
}

现在,我希望当我将后一个类的实例添加到前者时,列表中的顺序将在持久化时保留:

Run a = new Run();
a.setComment("a");

Run b = new Run();
b.setComment("b");

List<Run> runs = new LinkedList<Run>();
runs.add(a);
runs.add(b);

Sequence seq = new Sequence();
seq.setRuns(runs);

persist(seq); // order in database should be "a", then "b"

但是,当我检查数据库时,并不总是如此实例 a 的标识符低于 b ;它似乎表现得就像列表只是一个桶。

使用持久性时如何保持列表的顺序?如果在 b 之前添加实例 a ,我希望在数据库中保留订单,因为条目是连续执行测试的结果,并且订单必须保持不变。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

如果你想保留订单,你需要一个@OrderColumn注释 - 默认情况下,收集是用&#34; bag&#34;保存的。语义(不涉及订单)。这可以添加到OneToMany或ManyToOne注释中。

类似的东西:

@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "sequence")
@OrderColumn
private List<Run> runs;

有关信息,请参阅http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html

答案 1 :(得分:0)

这个怎么样? bit kludgy但不需要额外的列:

Sequence seq = new Sequence();
List<Run> runs = new LinkedList<Run>();
seq.setRuns(runs);

em.persist(seq);

Run a = new Run();
a.setSequence(seq);
a.setComment("a");
em.persist(a);
runs.add(a);
em.flush(); // this forces JPA provider to issue INSERT "a"

Run b = new Run();
b.setSequence(seq);
b.setComment("b");
em.persist(b);
runs.add(b);
em.flush(); // this forces JPA provider to issue INSERT "b"