Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA(日食)列表顺序_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA(日食)列表顺序

Java JPA(日食)列表顺序,java,jpa,eclipselink,Java,Jpa,Eclipselink,在使用EclipseLink时,在持久化过程中,我在保持列表的顺序方面遇到了一些问题。我是否错过了EclipseLink中的一些设置,或者忘记了使用一些注释 我有两个类,看起来有点像这样: @Entity @Table(name = "sequence") public final class Sequence { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @

在使用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
    // ...
}
@实体
@表(name=“sequence”)
公开期末课程顺序{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@OneToMany(cascade=CascadeType.PERSIST,mappedBy=“sequence”)
私人名单;
//其他领域
// ...
}
@实体
@表(name=“run”)
公开期末班{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@许多酮
@JoinColumn(name=“seq_id”,null=false)
私有序列;
@列(nullable=false)
私有字符串注释;
//其他领域
// ...
}
现在,我希望在将后一个类的实例添加到前一个类时,在执行以下操作时将保持列表中的顺序:

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"
runa=newrun();
a、 setComment(“a”);
运行b=新运行();
b、 设定注释(“b”);
列表运行=新建LinkedList();
增加(a);
增加(b);
Sequence seq=新序列();
顺序:设置运行(运行);
持久化(seq);//数据库中的顺序应该是“a”,然后是“b”
但是,当我检查数据库时,实例a的标识符并不总是低于b;它的行为似乎就像列表只是一个桶

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


谢谢你的帮助

如果要保留订单,需要@OrderColumn注释-默认情况下,集合使用“bag”语义保存(不涉及订单)。这可以添加到一个OneToMany或多个One注释上

比如:

@OneToMany(cascade = CascadeType.PERSIST, mappedBy = "sequence")
@OrderColumn
private List<Run> runs;
@OneToMany(cascade=CascadeType.PERSIST,mappedBy=“sequence”)
@订单列
私人名单;

有关信息,请参见。

像这样的怎么样?位笨拙,但不需要额外的列:

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"
Sequence seq=新序列();
列表运行=新建LinkedList();
顺序:设置运行(运行);
em.persist(seq);
运行a=新运行();
a、 设置顺序(seq);
a、 setComment(“a”);
em.a;
增加(a);
em.flush();//这将迫使JPA提供商发出INSERT“a”
运行b=新运行();
b、 设置顺序(seq);
b、 设定注释(“b”);
em.b;
增加(b);
em.flush();//这迫使JPA提供商发出插入“b”

这对我不起作用。当我坚持使用时,我得到了一个异常:“字段列表”中的未知列“runs\u ORDER”。您的数据库中的顺序需要一个特定的列(我认为它不能也不应该使用主id)。我添加了一个额外的列来跟踪列表顺序。感觉有点傻,但这似乎是唯一的办法。谢谢如果未指定任何排序
@OrderBy
@OrderColumn
,则根据元素的“id”排序。任何JPA文档都会告诉您这一点