1

我有一个对象列表,列表中的每个对象都有一个位置,除非明确更改,否则该位置可能不会改变,换句话说,对象在队列中。我应该在我的实体类中使用什么集合来存储这些对象以及该集合应该如何注释?

我目前有这个

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  List<Bar> bars = new ArrayList<Bar>();
  ...
}

如果纯粹使用 JPA 无法做到这一点,我将使用 EclipseLink 作为我的 JPA 提供程序,因此如果没有其他帮助,EclipseLink 特定的注释就可以了。

编辑:请注意,问题不在于 Java 不会保留订单,我知道大多数集合都会这样做,问题是我不知道 JPA 保留订单的聪明方法。有一个订单 ID 并通过它进行查询订单是可能的,但在我的情况下,维护订单 ID 很费力(因为用户界面允许重新排序项目),我正在寻找一种更智能的方法来做到这一点。

4

5 回答 5

4

如果您希望在往返 SQL 之后对其进行排序,则应在实体本身内提供某种排序 ID - SQL 自然是面向集合而不是面向列表的。然后,您可以在取回它们后进行排序,或者确保您的查询也指定了排序。

如果你给实体一个自动生成的整数 ID,这可能会起作用,但我不想保证。

于 2009-05-01T15:03:57.647 回答
4

按照 Jon 的建议,使用排序 ID,然后在 @OneToMany 下方添加 @OrderBy 注释。这将按指定字段对任何查询进行排序。

例如,如果您向 Bar 添加一个名为“sortId”的新字段,Foo 将如下所示:

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}
于 2009-05-01T16:34:11.517 回答
0

你可以

  1. 在创建之前对列表进行排序
  2. 创建后对列表进行排序
  3. 使用在插入时执行排序的集合。树图,树集
于 2009-05-01T15:08:27.277 回答
0

链表在java中实现了Queue接口,允许你在中间添加东西...

TBH 大部分系列都是订购的,不是吗...

检查文档,大多数人说它们是否被订购。

于 2009-05-01T15:09:42.563 回答
0

值得尝试 LinkedList 而不是 ArrayList,但是,正如 Jon 所说,您需要找到一种持久化订单信息的方法。

如果您需要 List,则在转换为 List 时,解决方案可能涉及向每个条目发出订单号并将其存储为 SortedMap。

但是,如果您将集合存储为 LinkedList,ORM 可能足够聪明,可以为您完成所有转换。

于 2009-05-01T15:14:09.573 回答