JPA:关于OneToMany关系中阻抗不匹配的问题

2023-12-06

我有一个关于 JPA-2.0(提供者是 Hibernate)关系及其在 Java 中相应管理的问题。假设我有一个部门和一个员工实体:

@Entity
public class Department {
  ...
  @OneToMany(mappedBy = "department")
  private Set<Employee> employees = new HashSet<Employee>();
  ...
}

@Entity
public class Employee {
  ...
  @ManyToOne(targetEntity = Department.class)
  @JoinColumn
  private Department department;
  ...
}

现在我知道我必须自己管理 Java 关系,如以下单元测试所示:

@Transactional
@Test
public void testBoth() {
  Department d = new Department();
  Employee e = new Employee();
  e.setDepartment(d);
  d.getEmployees().add(e);
  em.persist(d);
  em.persist(e);
  assertNotNull(em.find(Employee.class, e.getId()).getDepartment());
  assertNotNull(em.find(Department.class, d.getId()).getEmployees());
}

如果我遗漏任何一个e.setDepartment(d) or d.getEmployees().add(e)断言将会失败。到目前为止,一切都很好。如果我在两者之间提交数据库事务怎么办?

@Test
public void testBoth() {
  EntityManager em = emf.createEntityManager();
  em.getTransaction().begin();
  Department d = new Department();
  Employee e = new Employee();
  e.setDepartment(d);
  d.getEmployees().add(e);
  em.persist(d);
  em.persist(e);
  em.getTransaction().commit();
  em.close();
  em = emf.createEntityManager();
  em.getTransaction().begin();
  assertNotNull(em.find(Employee.class, e.getId()).getDepartment());
  assertNotNull(em.find(Department.class, d.getId()).getEmployees());
  em.getTransaction().commit();
  em.close();
}

我还需要管理双方的关系吗?不,事实证明,我不必这样做。通过这个修改

e.setDepartment(d);
//d.getEmployees().add(e);

断言仍然成功。但是,如果我只设置另一边:

//e.setDepartment(d);
d.getEmployees().add(e);

断言失败。为什么?是因为员工是关系的拥有方吗?我可以通过不同的注释来改变这种行为吗?或者它总是“OneToMany”的“One”一侧决定何时填充数据库中的外键字段?


我不知道你的测试想证明什么,但事实就是你must在处理双向关联时处理关联的双方。不这样做是不正确的。时期。

Update:虽然 axtavt 提到的规范参考当然是准确的,但我坚持认为,您绝对必须设置双向关联的双方。不这样做是不正确的,第一个持久性上下文中的实体之间的关联是broken. The JPA 维基百科书是这样说的:

与所有双向关系一样,您的对象模型和应用程序有责任维护双向关系。 JPA 中没有魔法,如果您向集合的一侧添加或删除,则还必须从另一侧添加或删除,请参阅对象损坏。从技术上讲,如果您仅从关系的拥有方添加/删除,数据库将被正确更新,但随后您的对象模型将不同步,这可能会导致问题。

换句话说,唯一的correct and safe在 Java 中管理双向关联的方法是设置链接的两侧。这通常是使用防御性链接管理方法来完成的,如下所示:

@Entity
public class Department {
    ...
    @OneToMany(mappedBy = "department")
    private Set<Employee> employees = new HashSet<Employee>();
    ...

    public void addToEmployees(Employee employee) {
        this.employees.add(employee);
        employee.setDepartment(this);
    }
}

我再说一遍,不这样做是不正确的。您的测试之所以有效,是因为您在新的持久性上下文中访问数据库(即一种非常特殊的情况,而不是一般情况),但代码在许多其他情况下会中断。

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

JPA:关于OneToMany关系中阻抗不匹配的问题 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 在 Jar 文件中运行 ANT build.xml 文件

    我需要使用存储在 jar 文件中的 build xml 文件运行 ANT 构建 该 jar 文件在类路径中可用 是否可以在不分解 jar 文件并将 build xml 保存到本地目录的情况下做到这一点 如果是的话我该怎么办呢 Update
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static

随机推荐

  • 找不到适合指定区域性的任何资源(资源文件中的 C# WinForm 图像)

    我将三个图像添加到名为 Resource1 resx 的文件中 我还添加了一根字符串只是为了测试目的 我在 GetString 或 GetObject image name 上收到此错误 找不到任何资源 适合特定文化 或中立文化 确保 Re
  • 使用 传递参数

    我使用 forEach 将参数传递给函数 代码如下
  • _ArrayType 或 _ArrayProtocol 在 Swift 3.1 中不可用吗?

    我正在使用 ArrayType在我的项目中 当我在 swift 2 1 上运行时 我上周升级到 swift 3 0 2 Xcode 8 2 1 我发现here that ArrayType更改为 ArrayProtocol而且效果很好 今天
  • 无法识别元素“folderLevelBuildProviders”?

    我使用Visual studio打开atomesite 我将MVC 1修改为MVC 2 构建成功 但网页给我这个错误 我尝试了 aspnet regiis iru 但不起作用 Server Error in Application Conf
  • 在 Elastic Search 中计算 *Facet 计数* 的有效方法

    我想计算构面查询 UI 的构面计数 但我认为我遗漏了一些东西 因为我无法使用构面过滤器获取所需的数字 这是一个例子 给定两个方面 每个方面具有三个可能的项 Colors red yellow blue Notes do re mi 当我进行
  • Python 终止符错误

    我正在和我的一个学校朋友一起开发一个 Python 项目 我们导入了 Turtle 和 Math 我的问题是 当我使用 Esc 按钮关闭窗口时 我收到一条错误消息 Terminator Error 我问过老师 但他们也不知道问题出在哪里 因
  • 如何使用文本扫描读取文件中的所有行

    我正在尝试使用以下内容读取 m 文件中的所有行 file content textscan fid s delimiter n whitespace 但这只是返回 file content 0x1 cell 实际上我的文件有 224 行 所
  • 如何下载在我的服务器(springboot)上生成的角度pdf文件?

    我想下载一个从基于 Spring 的 Restful Web 服务发送到我的 Angular 应用程序的 pdf 文件 如何下载它 我的 Angular 应用程序或 Spring Boot 上是否缺少一些代码 我从 Angular 6 应用
  • iPhone:屏幕截图[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 当用户进行屏幕截图时 按住主页按钮 电源 是否有任何方法在应用程序中调用 或者可以调用哪
  • 在 Python OpenCV 中解码 YUV 图像

    我有一个 YUV420 SP NV21 图像 表示为字节数组 无标头 取自 Android 预览帧 我需要将其解码为 RGB 图像 我之前在 Android 应用程序中使用 Java 和 OpenCV4Android 完成过此操作 conv
  • 使用 Visual Studio Code 自动保存文件更改

    我用过WebStorm从 JetBrains 工作已经快四年了 出于多种原因 它是一个出色的 IDE 但最好的功能之一是它可以在版本控制之外保存文件版本 因此 如果您在版本控制系统保存文件之前不小心删除了文件或丢失了文件 WebStorm
  • 如何完全禁用任何鼠标点击

    在用户单击 登录 按钮和其他事件后 我制作了一个加载脚本 让用户知道他们必须等待 直到 ajax 回复 如何禁用任何鼠标点击 右键单击 左键单击 双击 中键单击 x 单击 on div id doc 我想将该代码添加到loading js
  • 使用 OpenSSL “无法写入‘随机状态’”是什么意思?

    我正在生成一个自签名 SSL 证书来保护我的服务器的管理部分 并且我不断从 OpenSSL 收到此消息 无法写入 随机状态 这是什么意思 这是在 Ubuntu 服务器上 我已经升级了 libssl 来修复最近的安全漏洞 实际上 发生这种情况
  • 点击表单中的提交按钮后如何显示隐藏的div?

    我有一个带有提交按钮的简单 HTML 表单 点击此按钮后我想看看div my id这是以前不可见的
  • “zsh:找不到命令:sails”的问题

    我用 via 安装了 sails jssudo npm install g sails但我仍然得到zsh command not found sails 我正在使用 Ubuntu 14 04 LTS 首先找出节点的路径which node会
  • 错误 193 %1 不是有效的 Win32 应用程序

    当我运行此 python 命令时 我发现此错误 Error 193 1 不是有效的 Win32 应用程序Windll LoadLibrary C Windows System32 plcommpro dll 对于这个错误 我发现我的 plc
  • 需要 RestKit 数据同步场景的帮助

    我正在将 RestKit 用于 iOS To 应用程序 我已经使用restkit完成了以下操作 1 从rest api中以json格式拉取服务器对象 2 删除服务器上不再存在的核心数据中的孤立对象 现在我必须构建以下场景 如果设备上可以使用
  • 读取Excel单元格并将内容复制到txt文件

    我目前正在使用 RapidMiner 并尝试将 xlsx 文件中的 RapidMiner 结果复制到 txt 文件 以便使用 python 进行进一步处理 我在 A 列 A1 A1500 中有纯文本 在 C 列 C1 C1500 中有相应的
  • IStructuralEquatable 和 IStructuralComparable 解决什么问题?

    我注意到 NET 4 中添加了这两个接口以及几个相关的类 它们对我来说似乎有点多余 我读过几篇关于它们的博客 但我仍然不明白它们解决了哪些在 NET 4 之前很棘手的问题 有什么用IStructuralEquatable and IStru
  • JPA:关于OneToMany关系中阻抗不匹配的问题

    我有一个关于 JPA 2 0 提供者是 Hibernate 关系及其在 Java 中相应管理的问题 假设我有一个部门和一个员工实体 Entity public class Department OneToMany mappedBy depa