列表与JPA 2上的设置 - 优点/缺点/便利性

时间:2014-08-22 16:07:26

标签: java mysql hibernate jpa

我尝试在Stack Overflow和其他网站上搜索使用 vs 列表的优缺点和便利但我真的找不到DEFINITE的答案什么时候使用这个或那个。

从Hibernate的文档中,他们声明非重复记录应该进入集合,并且从那里,你应该为每个可以包装的实体实现你的hashCode()和equals() a 设置。但接下来是便利性和易用性的代价,因为有些文章建议使用业务密钥作为每个实体的id,然后从那里,hashCode()和equals()可以完美地实现每种情况无论对象的状态如何(托管,分离等)。

一切都很好,一切都很好......直到我遇到很多情况,使用集合是不可行的,比如Ordering(尽管Hibernate让你想到 SortedSet ),方便的collectionObj.get(索引),collectionObj.remove(int位置|| Object obj),Android的ListView / ExpandableListView(GroupIds,ChildIds)的架构和...我的观点是:< strong>集非常糟糕(imho)操纵并使其100%工作。

我很想将我的项目的每个集合更改为列表,因为它们运行良好。我所有实体的ID都是通过MYSQL自动生成的序列(@GeneratedValue(strategy = GenerationType.IDENTITY))生成的。

在上面提到的所有这些小细节中,是否有人可以明确地清楚我的想法?

此外,是否可以将Eclipse的自动生成的hashCode()和equals()用于每个实体的ID字段?它会在每种情况下都有效吗?

非常感谢,

雷纳托

2 个答案:

答案 0 :(得分:4)

List versus Set

允许重复 列表允许重复和集不允许重复。对于某些人来说,这将是他们选择List或Set的主要原因。

多个包的例外 - 在同一查询中多次提取 处理Hibernate的一个显着区别是,您无法在单个查询中获取两个不同的列表。 它会抛出一个异常&#34;无法取出多个包&#34;。但是有了套装,没有这样的问题。

答案 1 :(得分:3)

如果没有指定索引列,则列表将由Hibernate作为包处理(无特定排序)。

@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;

Hibernate处理的一个显着区别是,您无法在单个查询中获取两个不同的列表。例如,如果您有一个包含联系人列表和地址列表的Person实体,您将无法使用单个查询来加载具有所有联系人及其所有地址的人员。在这种情况下,解决方案是进行两次查询(避免使用笛卡尔积),或者为至少一个集合使用Set而不是List。

当你必须在实体上定义equals和hashCode并且在实体中没有不可变的功能键时,通常很难使用带有Hibernate的Sets。

此外,我建议你link