Java JPA(日食)列表顺序
在使用EclipseLink时,在持久化过程中,我在保持列表的顺序方面遇到了一些问题。我是否错过了EclipseLink中的一些设置,或者忘记了使用一些注释 我有两个类,看起来有点像这样: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; @
@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文档都会告诉您这一点