首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate关系混乱与uni和双向

Hibernate关系混乱与uni和双向
EN

Stack Overflow用户
提问于 2022-06-17 07:32:26
回答 1查看 70关注 0票数 -1

我有Spring经验,但是对于Hibernate来说是新的,在阅读了几篇教程和文章之后,我现在对一些观点太困惑了。请你澄清以下几个问题?

1.关于OneToMany关系,建议在表(例如Country表)中定义这种关系,而不是用country_id映射键来定义相关表(如Employee表)。但是,对于这种关系和其他关系,有不同类型的实现。

在Hibernate中,Uni或双向关系意味着什么?

你能给我举个例子或者给我一个好例子(除了那些也使我狡猾的文档),以便理解Hibernate中使用的所有关系吗?

2.用于ManyToMany关系,有些示例使用List<T>,而另一些则使用Set<T>Collection<T>。那么,定义多个关系实体的正确方法是什么?

3.还有一些不必要的实现,例如@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "book_id"),因为它们是默认实现。因此,据我所见,没有必要暗示这些默认设置,因为它们没有影响。这是真的吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-17 09:01:26

有许多选项,因为有许多不同的用例。

  1. 双向和uni之间的选择对Java对象映射实体、关联如何映射到数据库以及使用哪个查询Hibernate来加载实体(或转换HQL查询)都有影响。我不想详细介绍所有细节-- 这些文档已经做得很好了。 --但是如果我们采用以下双向关联: @Entity(name = " Person ") @Table(name="PERSON_TABLE")类Person { @Id私有Long id;@OneToMany(mappedBy = "person")私有列表电话=新的ArrayList<>();} @Entity @Table(name="PHONE_TABLE")类电话{ @Id私有长id;@ManyToOne个人;} Hibernate将映射它,在表person_id上添加一个列PHONE_TABLE。 如果我们将其映射为单向一对多的话: @Entity(name = " Person ") @Table(name="PERSON_TABLE")类person{ @Id私有Long id;@OneToMany(mappedBy = "Person")私有列表电话=新的ArrayList<>();} @Entity @Table(name="PHONE_TABLE")类电话{ @Id私有Long id;//该类中无多对一的 Hibernate创建了一个额外的表Person_Phone ( PHONE_TABLEPERSON_TABLE之间的桥梁),其中包含了person_idphone_id两列。
  2. 这取决于您期望关联包含的内容类型以及希望它返回的方式:它有副本吗?点菜了吗?您想要显示在db上的结果还是要在集合上使用可比较的结果?你用的是哪种地图?List通常是一个很好的泛型选项,但是在某些情况下,使用另一个实现可以获得更好的性能,例如当您需要加载多个关联时或希望加载多个关联时。关于堆栈溢出的这个问题解释了为什么一个人不能急切地加载多个列表和documentation 列出所有可用的集合 (网上还有更多的文章)。以下是文档的摘录: 当涉及到修改集合结构(移除或重组元素)时,单向袋并不是那么有效。 由于父端不能唯一地标识每个单独的子节点,Hibernate将删除与父实体关联的所有链接表行,并重新添加当前集合状态中找到的其余行。
  3. @JoinColumn是可选的,当用户想要更改某些默认值时,这通常是必要的。例如,当您想要更改列名时,映射关联: @Entity类Book { //默认列名将为author\_id,但我们将其更改为a\_id,//如果您对author_id没有意见,则@JoinColumn是不必要的@ManyToOne @JoinColumn(name = "a_id") Author }; 关于@ManyToOne(fetch = FetchType.LAZY),Hibernate不能总是懒洋洋地获取多对一的关联。因此,默认情况是EAGER。当Hibernate延迟加载关联时,它会创建预期类的代理对象。问题是,您可能有这样的代码: Book = session.find(Book.class,5);if ( book.getAuthor() == null ){ //做某事.} 如果Hibernate每次创建一个代理,getAuthor()将永远不会返回null。因此,如果hibernate可以猜测作者存在而不查询关联表,它将延迟加载它(例如,当指定关联始终存在时),否则它只会查询关联表并急切地创建对象。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72655802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档