我有一个实体,在另一个实体上有 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
来管理关联。
我必须删除这个实体。这就是我所做的:
- 删除
entity2M
(我可以确认它已在数据库中正确删除); - 删除
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/