簡體   English   中英

JPA(EclipseLink)列表順序

[英]JPA (EclipseLink) list order

在使用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 ; 它似乎表現得好像列表只是一個桶。

使用持久性時如何保持列表的順序? 如果實例AB前加入,我想保留在數據庫中的順序作為條目的測試順序執行的結果和秩序必須perserved。

謝謝你的幫助!

如果要保留訂單,則需要@OrderColumn注釋 - 默認情況下,集合以“bag”語義保存(不涉及訂單)。 這可以添加到OneToMany或ManyToOne注釋中。

就像是:

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

有關信息,請參見http://docs.oracle.com/javaee/6/api/javax/persistence/OrderColumn.html

這個怎么樣? 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM