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

Spring JPA:插入新实体并级联分离引用

洪弘亮
2023-03-14

我有两个实体类Organization和User具有一对多关系(为了简单起见,Groovy代码!):

@Entity
class Organisation {
  @Id Long id
  String name
  @OneToMany
  List<User> users
}

@Entity 
class User {
  @Id Long id
  String username
  @ManyToOne(optional=false, cascade = CascadeType.Persist)
  Organisation organisation
}

当我为一个新的组织创建一个新的用户时,一切都运行良好:

def user = new User(organisation: new Organisation(...))

但当我使用一个现有的组织,将其设置为新用户的组织属性时,我会得到一个错误:

def user = new User(organisation: organisationRepository.findOne(orgId))
userRepo.save(user)

将导致:

org.hibernate.PersistentObjectException:传递给Persist:Organization的分离实体

我知道不能对一个分离的实体调用persist。但是在这种情况下,由于我没有更改组织实体本身的任何内容,所以我认为hibernate会允许这样做。

我试图将cascade={cascadeType.persist,cascadeType.merge}放入ManyToOne批注中,但结果是同一个错误。

我想要存档的东西在hibernate中是不可能实现的,还是我在某个地方出现了思维错误?

共有1个答案

滑乐逸
2023-03-14

你在正确的方向上:

cascade = {CascadeType.Persist, CascadeType.Merge}

问题是,当您仍然执行save操作时,持久化提供程序会尝试级联persist操作,因此它最终会尝试持久化已经设置了@ID并已分离的组织实体。

您必须做的是执行合并而不是保存

在这种情况下,新的实体将被持久化,并且组织将被合并回持久化上下文中,因此允许整个操作成功。

请记住,当您使用merge并希望在之后对传递的实体执行操作时,您需要将结果赋值给一个新变量并对其执行操作,例如:

User mergedUser = userRepo.merge(user);

// operations on mergedUser from now on
 类似资料:
  • null 我能找到的使用JPA/Hibernate的唯一有效解决方案是执行以下步骤。这是因为hibernate将实体保留在第一级缓存中,直到事务结束。 创建新实体 强制快速刷新() 分离实体 这样做的开销是 null 使用JDBC或JdbcTemplate,但您必须为实体编写自己的插入 所以问题是:是否存在同时坚持和分离的可能性,或者甚至更好地坚持而不成为被管理的?

  • 我是JPA和Hibernate的新手。我有两个实体,供应商和产品,如下所述。 我的问题与@ManyToOne注释中使用属性 有关。我希望用@ManyToOne注释的相应列不为空。但是,当我使用以下测试测试实体的持久性时: 其中createOrUpdateEntity方法是DAO Bean对象的一部分 我收到错误: 编辑:实现此示例,该示例使用注释为 null 可为 null = false 的@M

  • 问题内容: 我有一个引用实体Bar的实体Foo: 当我坚持使用新的Foo时,它可以引用新的Bar或现有的Bar。当它得到一个现有的Bar(恰好是分离的)时,我的JPA提供程序(hibernate)抛出以下异常: 当我确保对Bar的引用进行管理(附加)时,或者当我在关系中省略级联PERSIST时,一切都很好。 但是,两种解决方案都不是100%令人满意的。如果我删除了级联持久化,显然我不能再以新Bar

  • 问题内容: 我正在使用Spring Boot并通过jpahibernate。我正在使用JpaRepository接口来实现我的存储库。与以下UserRepository一样 我想实现以下目标 加载用户实体。 更改实体对象的状态,例如user.setName(“ foo”) 进行外部系统Web服务调用。将通话结果保存到数据库中 仅在成功响应此Web服务调用后,才将用户的新状态保存在存储库中。 以上所

  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗

  • 我尽力解释了这个问题,如果你需要更多的信息,请告诉我。