您使用哪种Javatypes来进行JPA集合,为什么?

您在JPA域模型中使用以下哪种集合types,原因如下:

  • java.util.Collection
  • java.util.List
  • java.util.Set

我想知道这是否有一些基本的规则。

更新我知道SetList之间的区别。 List允许重复,并有一个顺序和一个Set不能包含重复的元素,并没有定义顺序。 我在JPA的背景下提出这个问题。 如果您严格遵循定义,那么您应始终使用Settypes,因为您的集合存储在关系数据库中,在那里您不能有重复项,并且您自己定义了一个顺序,即您的顺序Java List不一定保存在数据库中。

例如,大多数时候我使用Listtypes,不是因为它有一个顺序或允许重复(我不能有),因为我的组件库中的一些组件需要一个列表。

就像你自己的问题所暗示的那样, 关键是域名,而不是JPA 。 JPA只是一个框架,你可以(也应该)以最适合你的问题的方式使用。 由于框架(或其限制)而select不理想的解决scheme通常是一个警告。

当我需要一个集合,从不关心订单,我使用一个Set 。 当由于某种原因,订单是重要的(有序列表,datesorting等),那么一个List

您似乎很清楚CollectionSetList之间的区别。 使用一个和另一个的唯一原因只取决于您的需求。 您可以使用它们与您的API(或您未来的自己)的用户沟通您的集合的属性 (可能是微妙的或隐含的)。

这与遵循与在代码中的其他任何地方使用不同集合types完全相同的规则。 你可以使用Object或者Collections作为你的所有引用,但是在大多数情况下你可以使用更多的具体types。

例如,当我看到一个List ,我知道它是以某种方式sorting的,而且这个重复对于这种情况是可以接受的或者是不相关的。 当我看到一个Set ,我通常期望它没有重复,也没有特定的顺序(除非它是一个SortedSet )。 当我看到一个Collection ,我不希望有更多的东西比包含一些实体。

关于列表sorting…是的,它可以保存。 即使它不是,而你只是使用@OrderBy ,它仍然可以是有用的。 考虑默认情况下按时间戳sorting的事件日志示例。 人为地对列表进行重新sorting是没有意义的,但是默认情况下sorting也是有用的。

我觉得使用Set或List的问题困难得多。 至less当你使用hibernate作为JPA实现的时候。 如果在hibernate状态下使用List,它会自动切换到“Bags”范例,其中可以存在重复项。

这个决定对hibernate执行的查询有显着的影响。 这里有一个小例子:

有两个实体, 员工公司 ,典型的多对多关系。 为了将这些实体映射到彼此,JoinTable(让我们称之为“employeeCompany”)存在。

您在两个实体(公司/员工)上select数据types列表

因此,如果您现在决定从CompanyXY中 删除 Employee Joe ,则hibernate将执行以下查询:

 delete from employeeCompany where employeeId = Joe; insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXA); insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXB); insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXC); insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXD); insert into employeeCompany(employeeId,companyId) values (Joe,CompanyXE); 

现在的问题是:为什么地狱不仅执行该查询hibernate?

 delete from employeeCompany where employeeId = Joe AND company = companyXY; 

答案很简单(Nirav Assar对他的博客文章非常感兴趣): 它不能 。 在包包的世界里,删除所有剩余的东西是唯一正确的方法! 阅读更多的说明。 http://assarconsulting.blogspot.fr/2009/08/why-hibernate-does-delete-all-then-re.html

现在最重要的结论是:

如果您在Employee / Company – Entities中selectSet而不是List,那么您没有该问题,只会执行一个查询!

为什么呢? 由于hibernate不再处于行囊(如你所知,集合不允许重复),现在只能执行一个查询。

所以List和Sets之间的决定并不那么简单,至less在查询和性能方面!

我通常使用一个列表。 我发现List API远比Set更适用于其他库。 列表更容易迭代,通常对于大多数操作和内存来说效率更高。

事实上,一个关系不能重复,而且通常也不需要使用Set,所以你可以使用任何Collectiontypes对你的应用程序最有用。

这取决于你的模型,但是如果你要做很多包含检查的事情,那么Set会更有效率。

您可以使用@OrderBy或@OrderColumn在JPA中订购关系。

参见http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Ordering

JPA中通常不支持重复项,但是一些映射(如ElementCollections)可能支持重复项。

我用:

  • 设置:集合中的项目没有顺序并且是唯一的
  • 列表:当项目有一个订单

当使用Netbeans生成实体时,我认为使用Collection作为通用默认是一个很好的起点,那么当你弄清楚你的模型实际是什么,并且需要更多的function时,你可以很容易地改变它并保持向后兼容。