您在 JPA 域模型中使用以下哪种集合类型以及原因:
java.util.Collection
java.util.List
java.util.Set
我想知道这是否有一些基本规则。
UPDATE 我知道 Set
和 List
之间的区别。 List
允许重复并具有顺序,而 Set
不能包含重复元素且不定义顺序。我在 JPA 的背景下问这个问题。如果您严格遵循定义,那么您应该始终使用 Set
类型,因为您的集合存储在关系数据库中,您不能在其中重复并且您自己定义了一个订单,即Java List
中的顺序不一定保留在数据库中。
例如,我大部分时间都在使用 List
类型,不是因为它有顺序或允许重复(反正我不能有),因为其中的一些组件我的组件库需要一个列表。
最佳答案
就像您自己的问题所暗示的那样,关键是域,而不是 JPA。 JPA 只是一个框架,您可以(并且应该)以最适合您的问题的方式使用它。由于框架(或其限制)而选择次优解决方案通常是一个警钟。
当我需要一套而不关心顺序时,我会使用 Set
。当由于某种原因顺序很重要(有序列表、按日期排序等)时,则使用 List
.
您似乎很清楚 Collection
、Set
和 List
之间的区别。使用一个与另一个的唯一原因仅取决于您的需求。您可以使用它们向您的 API 用户(或您 future 的自己)传达您集合的属性(可能是微妙的或隐含的)。
这与在整个代码中的其他任何地方使用不同的集合类型所遵循的规则完全相同。您可以对所有引用使用 Object
或 Collections
,但在大多数情况下,您会使用更具体的类型。
例如,当我看到一个 List
时,我知道它是以某种方式排序的,并且对于这种情况,重复项要么是可以接受的,要么是不相关的。当我看到一个 Set
时,我通常希望它没有重复项和特定顺序(除非它是一个 SortedSet
)。当我看到 Collection
时,除了包含一些实体之外,我不希望它有任何其他的东西。
关于列表排序...是的,可以保留。即使它不是并且您只使用 @OrderBy
,它仍然很有用。想想默认按时间戳排序的事件日志的例子。人为地重新排序列表没有什么意义,但默认排序仍然很有用。
关于java - 您将哪种 Java 类型用于 JPA 集合,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4655392/