gpt4 book ai didi

java - JPA 删除的实体在 JoinColumn 上重新创建实体

转载 作者:行者123 更新时间:2023-12-01 12:00:50 25 4
gpt4 key购买 nike

我有一个实体,在另一个实体上有 OneToOne JoinColumn 。像这样的东西:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idEntity1;
...
@Column(nullable = true)
private Integer idEntity2;
@OneToOne(optional=true)
@JoinColumn(insertable=false, updatable=false, nullable = true, name="idEntity2")
private Entity2Model entity2M;

正如您所看到的,我想自己管理这个实体(我不需要任何插入或更新)。事实上,我自己使用 idEntity2 来管理关联。

我必须删除这个实体。这就是我所做的:

  1. 删除entity2M(我可以确认它已在数据库中正确删除);
  2. 删除entity1M

问题出在步骤 2 entity2M 被重新创建。我发现这是因为我的删除代码如下所示:

public void delete(T entity) {
T entityToBeRemoved = em.merge(entity);

em.remove(entityToBeRemoved);
}

显然,em.merge 重新创建了entity2M。我知道我可以在删除之前使用 entity1M.setEntity2M(null); 解决此问题,但我真的很想避免这种情况。

为什么insertable=false, updatable=false不足以防止这种情况发生?

最佳答案

为了避免显式 entity1M.setEntity2M(null);,您可以在其中使用属性 cascade={CascadeType.REMOVE, CascadeType.PERSIST, CascadeType.REFRESH} @OneToOne 注释。

通过排除 CascadeType.MERGE,您可以防止 EntityManager 实例合并此映射字段。因此,OR 映射器将知道您不想合并(重新创建)(仍然)引用的实体(通过其映射伙伴)。

所以你的代码应该类似于:

@OneToOne(optional=true, cascade={CascadeType.REMOVE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(insertable=false, updatable=false, nullable = true, name="idEntity2")
private Entity2Model entity2M;

希望这对您有所帮助。

关于java - JPA 删除的实体在 JoinColumn 上重新创建实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com