当前位置: 首页 > 面试题库 >

Java使OneToOne关系变得懒惰

吴镜
2023-03-14
问题内容

在我们正在开发的此应用程序中,我们注意到一个视图特别慢。我剖析了该视图,并注意到,即使数据库中只有两个对象要获取,hibernate也执行了一个查询,该查询花费了10秒。所有OneToManyManyToMany关系都是懒惰的,所以这不是问题。在检查实际执行的SQL时,我注意到查询中有80多个联接。

在进一步检查该问题时,我注意到该问题是由实体类的深入层次结构OneToOneManyToOne实体类之间的关系引起的。所以,我想,我只是让它们变得懒惰,应该可以解决问题。但是注释@OneToOne(fetch=FetchType.LAZY)@ManyToOne(fetch=FetchType.LAZY)似乎不起作用。要么我得到一个例外,要么然后它们实际上没有被代理对象替换,因此变得懒惰。

有什么想法可以让我工作吗?请注意,我不使用persistence.xml来定义关系或配置详细信息,所有操作均以Java代码完成。


问题答案:

首先,对KLE的答案进行一些澄清:

  1. 无约束(可为空)的一对一关联是没有字节码检测就无法代理的唯一关联。原因是所有者实体必须知道关联属性应包含代理对象还是NULL,并且由于通常是通过共享PK进行一对一映射,因此无法通过查看其基表的列来确定该属性。无论如何,必须急切地获取代理,使其毫无意义。这是更详细的说明。

  2. 多对一关联(显然是一对多)不受此问题的困扰。所有者实体可以轻松地检查其自己的FK(如果是一对多,则最初会创建空集合代理并按需填充),因此关联可以很懒。

  3. 用一对多替换一对一几乎不是一个好主意。你可以用唯一的多对一替换它,但是还有其他(可能更好)的选择。

Rob H.有一个有效的观点,但是根据你的模型,你可能无法实现它(例如,如果一对一关联可以为空)。

现在,就原始问题而言:

A)@ManyToOne(fetch=FetchType.LAZY)应该工作正常。你确定查询本身不会覆盖它吗?可以html" target="_blank">join fetchHQL中指定和/或通过Criteria API显式设置获取模式,这将优先于类注释。如果不是这种情况,但你仍然遇到问题,请发布你的课程,查询和生成的SQL,以进行更多的即时对话。

B)@OneToOne比较棘手。如果绝对不能为空,请遵循Rob H.的建议并将其指定为:

@OneToOne(optional = false, fetch = FetchType.LAZY)

否则,如果你可以更改数据库(向所有者表添加外键列),请进行更改并将其映射为“ joined”:

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()

并在OtherEntity中:

@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()

如果你不能做到这一点(并且不能随心所欲地获取),则字节码检测是你唯一的选择。但是,我必须同意CPerkins的意见-如果你有80 岁!由于渴望OneToOne协会而加入,那么你遇到了更大的问题



 类似资料:
  • 问题内容: 在我们正在开发的此应用程序中,我们注意到一个视图特别慢。我对视图进行了概要分析,发现即使数据库中只有两个对象要获取,hibernate也执行了一个查询,该查询花费了10秒。所有和关系都是懒惰的,所以这不是问题。在检查实际执行的SQL时,我注意到查询中有80多个联接。 在进一步检查该问题时,我注意到该问题是由实体类的深入层次结构和实体之间的关系引起的。所以,我想,我只是让它们变得懒惰,应

  • 问题内容: 我接下来的两个实体之间具有OneToOne关系: 我正在尝试运行以下代码: 但是我得到这个错误: 我可以“解决”它,将代码更改为: 我的问题是,哪种方法可以持久保持OneToOne关系?在我的代码中,为什么要保存关系的两个部分以使其起作用? 问题答案: 再来一次。 每个双向关联都具有两个方面:所有者方面和相反方面。反面是具有属性的那一面。所有者方是另一方。JPA / Hibernate

  • 我正在使用教义2来绘制学术时间表。以下是对这些关系的简化观察: 一个类有事件(一对多) 事件具有类型(多对一) 一个事件有一个位置(多对一) 使用

  • 我有和。他们有一个不可撤销的关系。 如何查询具有空的所有对象? 因为如果我这样做: JPA引擎在两个表之间进行连接,并放置一个无用的WHERE子句()。恢复时,它会执行一个无用的本机SQL。怎么能 当前解决方案: 阅读OpenJPA文档时,我发现应该使用本机查询来解决JPA的限制。我可以很容易地使用本机查询,我目前正在这样做,但我想避免使用它。

  • 第404页的“Java持久性2.0,最终发布”有以下示例: 示例3:从一个可嵌入类到另一个实体的一对一关联。 我希望员工内部有多个位置详细信息: 如何更改实体ParkingSpot以指向集合表EMP_LOCATION内的可嵌入Location细节。 应该是 替换为@ElementCollection? 非常感谢。

  • 我有两个类具有单向的单人关系: 当我救了这些类,一切都很好。现在,我想基于现有的a检索另一个。我创建了一个CriteriaQuery,它基本上是“Select*FROM OTHERE WHERE a=:a”。但是当我将A类型的对象设置到查询中时,它将失败。查看数据库,我可以看到另一个.a字段实际上是一个varchar,其值为“typeA:123”(其中123是a对象的ID)。不幸的是,我不能在这里