如何使 JPA OneToOne 关系变得懒惰

2023-11-22

在我们正在开发的这个应用程序中,我们注意到视图特别慢。我分析了视图并注意到 hibernate 执行了一个查询,即使数据库中只有两个对象需要获取,该查询也花费了 10 秒。全部OneToMany and ManyToMany关系很懒惰,所以这不是问题。当检查实际执行的 SQL 时,我注意到查询中有超过 80 个连接。

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

有什么想法让我让它发挥作用吗?请注意,我不使用persistence.xml定义关系或配置细节,一切都是在java代码中完成的。


首先,一些澄清KLE的回答:

  1. 无约束(可为空)一对一关联是唯一一种在没有字节码检测的情况下无法代理的关联。这样做的原因是所有者实体必须知道关联属性是否应该包含代理对象或 NULL,并且它无法通过查看其基表的列来确定,因为一对一通常是通过共享 PK 映射的,所以它无论如何都必须急切地获取代理,这使得代理毫无意义。这是一个更详细解释。

  2. 多对一关联(显然是一对多)不会遇到这个问题。所有者实体可以轻松检查自己的 FK(在一对多的情况下,最初会创建空集合代理并根据需要填充),因此关联可以是惰性的。

  3. 用一对多代替一对一几乎从来都不是一个好主意。您可以将其替换为独特的多对一,但还有其他(可能更好)的选项。

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

现在,就原来的问题而言:

A) @ManyToOne(fetch=FetchType.LAZY)应该可以正常工作。您确定它没有在查询本身中被覆盖吗?可以指定join fetch在 HQL 中和/或通过 Criteria API 显式设置获取模式,该模式优先于类注释。如果情况并非如此,并且您仍然遇到问题,请发布您的类、查询和结果 SQL,以进行更切题的对话。

B) @OneToOne比较棘手。如果它绝对不能为空,请按照 Rob H. 的建议进行指定,如下所示:

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

否则,如果您可以更改数据库(向所有者表添加外键列),请执行此操作并将其映射为“已连接”:

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

在其他实体中:

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

如果你做不到这一点(并且不能忍受急切的获取),字节码检测是你唯一的选择。我必须同意CPerkins,但是 - 如果你有80!!!由于渴望一对一关联而加入,你会遇到比这更大的问题:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 JPA OneToOne 关系变得懒惰 的相关文章

  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • 实体创建无用的 id 字段

    我有一个CrudRepository与两个实体 Problem 特征实体总是创建一个附加的id数据库中的字段但未选择正确的characteristic id要生成的字段JSON machine entity machine id name
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • 到底什么是哈希冲突

    HashMap 中的哈希冲突或哈希冲突并不是一个新主题 我遇到过几个博客和讨论板 以模糊且详细的方式解释如何产生哈希冲突或如何避免它 我最近在一次采访中遇到了这个问题 我有很多事情要解释 但我认为很难准确地给出正确的解释 抱歉 如果我的问题
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap
  • 如何知道 glassfish 是什么 - 完整平台或网络配置文件?

    我已经安装了glassfish 我可以跑 asadmin version 它显示了它是什么版本 但如何知道它是 完整平台 还是 Web 配置文件 你可以使用 glassfish4 bin gt asadmin list containers
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • 有界通配符相关的编译器错误

    我想知道这段代码有什么问题 Map 但我试图说得更具体 这个问题在这个旧的 Apache 线程 ht
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • Jackson 的 ObjectMapper 和 SQL 中的 RowMapper

    我们正在使用对象映射器 当将 ObjectMapper 与 RowMapper 一起使用时 是否应该在每个 mapRow 内部 如下所示 声明它 还是在 mapRow 外部声明为类公共成员 我认为根据本文 它应该作为公共类成员在外部 我应该
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE

随机推荐

  • CLR 同步块地址

    当我做 public class Employee public int exp class Program static void Main string args Employee o1 new Employee o1 exp 3 lo
  • Three.js 中的内存泄漏

    我们正在尝试创建一个单页面应用程序 用户可以在其中在多个 Three js 应用程序之间切换 然而 我们注意到该选项卡的内存使用量不断增加 我们的应用程序中没有内存泄漏 并且 Three js 变量似乎没有从 RAM 中清除 重新创建的步骤
  • 在 IIS 中部署时打开内存映射文件会导致 FileNotFoundException

    以下代码示例来自this网站上 我创建了一个 Windows 控制台应用程序 用于创建映射内存文件 using var file MemoryMappedFile CreateNew myFile 24 var bytes new byte
  • 通过 webhook 触发 azure 管道?

    我想通过 Webhook 触发 Azure DevOps 管道 例如 我希望能够使用一些 JSON 向 Azure 上的某个端点发送 POST 然后让该端点触发要调用的管道 并向其传递 JSON 这可能吗 现在可在 Azure DevOps
  • 从符号链接获取真实路径 C#

    有谁知道如何从符号链接文件或文件夹中获取真实路径 谢谢你 大家好 经过我的研究 我找到了这个解决方案来获取符号链接的真实路径 如果您创建了符号链接并想检查该文件或文件夹的真实指针在哪里 如果有人有更好的写法请分享 DllImport ker
  • 如何为 ember.js 创建自定义适配器?

    我计划使用 ember js 但是我的 REST api 与打包的 REST 适配器并不完全一致 我想 覆盖 find 并能够将我自己的 ajax 放入其中 我不喜欢 ember findAll 在没有分页选项的情况下检索所有文档 因此与其
  • React 模式对话框的内容不可用于使用 mount() 的酶测试

    我有一个带有模式对话框的 React 组件 使用构建reactstrap 但其他人也报告了类似的问题react bootstrap和其他类型的模态组件 Enzyme 无法找到模态中的任何组件 即使它们在实际应用程序中呈现良好 最小的例子 i
  • 提高 R Rayshader 图像的分辨率

    我正在尝试使用 Rayshader 包制作图像 我很高兴能够使用如下代码创建 png 文件 library ggplot2 library rayshader example plot lt ggplot data frame x c 1
  • 如何在没有元类冲突的情况下将泛型类型与 PyQt 子类一起使用?

    我曾尝试过abc ABCMeta使用 sip 包装类型 并且当子类化时它工作得很好abc ABC class QABCMeta wrappertype ABCMeta pass class WidgetBase QWidget metacl
  • AngularJS - 在登录时存储基本身份验证

    我对此感到很头疼 我对 API 的使用还比较陌生 还没有做过任何需要身份验证的事情 我一直坚持向 API 发送 POST 请求 创建内容片段的端点是 entity node 如果我发送以下内容 我可以发送成功的 POST 请求 header
  • 将 dict 转储到 JSON 时保持顺序

    我想将数据库查询的结果序列化为 JSON 每行都有许多列 我添加到一个字典中 这些列按一定顺序排列 但是当我序列化数据时 顺序会发生变化 我尝试使用OrderedDict 但仍然看到同样的问题 如何保持列的顺序 res a i 0 b i
  • :[属性=值]的第n个子级(2n)

    我有一个包含行的列表 每一行li有一个属性data status其值可以是1 5 ul li li li li li li li li li li li li li li li li li li li li li li ul
  • 如何在 ASP.net Core 2 的 appsettings.json 中加密密码?

    我想使用 appsettings json 来存储 主密码 然后 该主密码将用于打开由这个出色的密码存储包生成的私钥 及其后续密码存储 https github com neosmart SecureStore 问题是 我想不出任何方法来加
  • R 中形状文件到光栅的转换?

    我从 worldwildlife org 下载了一个关于世界陆地生态区的形状文件 该文件可以在此处加载 http worldwildlife org publications terrescial ecoregions of the wor
  • 重新编译后 Mex 函数未更新

    我有一个简单的 mex 函数 它从库中调用另一个 C 函数 我编译源代码 mex cxx mymexfunction cpp I some include L some lib lmylib mylib 库是动态的 so 并且自身与其他一些
  • 在列表中移动项目?

    在Python中 如何将项目移动到列表中的确定索引 Use the insert列表方法 l list l insert index item 或者 您可以使用切片表示法 l index index item 如果要将列表中已有的项目移动到
  • Typescript:将函数添加到 moment.js 命名空间

    我正在尝试向 moment js 库添加额外的功能 我想添加一个函数 它本身需要在其主体中调用 moment 但我很难弄清楚这一点 我正在使用最新版本的 Typescript 和 moment js 我试图找到解决方案 但一无所获 这个解决
  • wxPython:如何找出哪个小部件具有焦点?

    我如何找出我的中的哪个小部件wx Frame有重点吗 您应该能够使用 Window 类的静态FindFocus 方法返回具有焦点的对象 api http www wxpython org docs api wx Window class h
  • 为什么C++中同时存在结构体和类?

    据我们所知 struct and class在语言中的许多地方可以互换 令人困惑的是 关键字本身不一定对应于标准中使用的语言 例如 在标准草案 N4567 class 10 中 A POD struct109 is a non union
  • 如何使 JPA OneToOne 关系变得懒惰

    在我们正在开发的这个应用程序中 我们注意到视图特别慢 我分析了视图并注意到 hibernate 执行了一个查询 即使数据库中只有两个对象需要获取 该查询也花费了 10 秒 全部OneToMany and ManyToMany关系很懒惰 所以