在使用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 ,我希望在数据库中保留订单,因为条目是连续执行测试的结果,并且订单必须保持不变。
感谢您的帮助!
答案 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"