ren*_*joc 5 java mysql hibernate jpa
我曾尝试在 Stack Overflow 和其他网站上搜索使用Sets与Lists的优点、缺点和便利,但我真的找不到关于何时使用这个或那个的明确答案。
从 Hibernate 的文档中,他们指出非重复记录应该进入Sets,从那里,你应该为每个可以包装到Set 的单个实体实现你的 hashCode() 和 equals() 。但随后谈到了便利性和易用性的代价,因为有一些文章推荐使用业务键作为每个实体的 id,从那里开始,hashCode() 和 equals() 可以在每种情况下完美实现无论对象的状态如何(托管、分离等)。
一切都很好,一切都很好……直到我遇到很多使用Sets不可行的情况,例如排序(尽管 Hibernate 为您提供了SortedSet的想法),collectionObj.get(index) 的便利性, collectionObj.remove(int location || Object obj)、Android 的 ListView/ExpandableListView 架构(GroupIds、ChildIds)等等……我的观点是:集合真的很糟糕(恕我直言)操作并使其 100% 工作。
我很想将我项目的每个集合都更改为List,因为它们运行良好。我所有实体的 ID 都是通过 MYSQL 的自动生成序列 ( @GeneratedValue(strategy = GenerationType.IDENTITY))生成的。
有没有人可以在上面提到的所有这些小细节中以明确的方式清除我的想法?
另外,是否可以将 Eclipse 自动生成的 hashCode() 和 equals() 用于每个实体的 ID 字段?它会在所有情况下都有效吗?
非常感谢,
雷纳托
如果没有指定索引列,列表将被 Hibernate 作为包处理(无特定顺序)。
@OneToMany
@OrderBy("lastname ASC")
public List<Rating> ratings;
Hibernate 处理中的一个显着差异是您无法在单个查询中获取两个不同的列表。例如,如果您有一个包含联系人列表和地址列表的 Person 实体,则您将无法使用单个查询来加载人员及其所有联系人和所有地址。这种情况下的解决方案是进行两次查询(这可以避免笛卡尔积),或者对至少一个集合使用 Set 而不是 List。
当您必须在实体上定义 equals 和 hashCode 并且实体中没有不可变的功能键时,通常很难将 Sets 与 Hibernate 一起使用。
此外我建议你这个链接。