当前位置: 首页 > 知识库问答 >
问题:

JPA(带Hibernate)@ManyTomany@Jointable relationship cascade

凌声
2023-03-14

为了使问题变得简单,让我们假设我有一个具有三个属性的用户实体:id、email和一组角色(owner、@manytomany、@jointable)。我将合并至少具有一个或多个角色用户实体,而不通过EntityManager查找它:

User user = new User(); //detached
user.setId(1L); // for merge
user.setEmail("newemailaddress@example.com");

entityManager.merge(user);

数据库中的结果是:

UPDATE user... /*ok!*/
delete from user_role where ... /* I'd like to avoid it! */

共有1个答案

南门新荣
2023-03-14

我认为,问题是您试图合并一个分离的实体。如果是这样的话,分离的实体就不再在您保存它的同一会话中了。当您合并它时,您将创建新的实例并尝试从以前的托管实例复制状态(它不再是托管实体,因为它是分离的实体),这样您将得到一个空的状态,并且hibernate将删除这个对象,因为它是空的。您需要从会话中提取托管实体,然后进行合并。这只是我的猜测。

编辑:

你的实体是级联的。这些实体的结果在user_role中表示。假设您用一些roles集合持久化了User(ID=30L)。现在,您在UI中使用了这个分离对象,并且由于某些情况需要merge()。如果是这样,您只需创建具有相同类型和相同PK的新实例(在您的UI中,并为其设置一些新状态(通常您不创建它,您只是通过id从会话范围获取它)。当您尝试执行它时,hibernate会尝试查找具有相同标识的对象。

>

  • 如果它找到它,它只需在表中更新它。

    如果没有,它将在表中创建一个新的。

    所以我认为你的版本是第一个。

  •  类似资料:
    • 我正在将项目的数据库管理从JDBC MySQL转换为JPA Hibernate,数据库应该保持不变。(从一个简单的Jersey API到带有Hibernate API的spring)。 有公司表、客户表和优惠券表。每个公司可以管理许多优惠券,每个客户也可以‘购买’许多优惠券。 因此,我有一个名为company_coupon的联接表和另一个名为customer_coupon的表。 当删除一个公司时,

    • 在JPA中,实体的字段是否可能同时具有@ManyTomany和@ManyToOne注释? 这是我的桌子: 这是我的实体(简化的ofc): 我会尽力解释: > @ManyToOne:Entity2和Entity3都有一个引用Entity1的字段。所以有一个多对一的关系。 所以有了这个,我想我必须使用@ManyTomany。但我发现了一些错误。 所以我想知道:这有可能把@ManyTomany和@Man

    • 问题内容: 我下面有两个… 我想更新的,有时也用下面的方法有时… 方法#1 方法#2 第一种方法可以正常工作,但第二种则不能。但是,当我将“ 从” 移至“ 第二”方法时,效果很好,而不是第一个。 问题答案: 问题是一个问题。 假设它是的子类,那么您的问题是关系中只有一方是拥有实体。将使得实体所属的实体,因此仅改变该实体被持久化。这意味着,你必须更新在这两种情况下的实体。如果您有一个“ a”的组列表

    • 上下文:我有两个表Secret_Agent和secret_mission。两者之间有一种@manytomany的关系,因为可以给许多特工执行相同的秘密任务,而同一个特工可以给许多秘密任务。 表SECRET_AGENT 列SecretAgentId,SecretAgentName 表SECRET_MISSION 列SecretMissionId、SecretMissionName、SecretMis

    • 问题内容: 我有实体和 我可以按用户实体获得所有测试: 但是我可以使用哪个查询查找所有测试? 问题答案: 以下方法签名将使你想要: 这是使用Spring Data JPA 的属性表达式功能。签名将转换为。请注意,这将对给定的用户名执行完全匹配。

    • 我是一个编程新手,有一个相当复杂的问题。我希望有人知道如何解决以下问题: 和科斯: 我只想要几个变量(这就是为什么我不能做全选)。我还认为我不应该用内部连接来编写广泛的查询,所以我没有这样做(它适用于大多数查询,除了列表变量)。 这是ContactRepository的相关部分: 如果有什么重要的东西我应该在这里补充,请告诉我。提前道谢! 编辑:应用程序运行时,只有当我尝试在运行时访问特定的数据时