我在另一个实体上有一个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
不足以阻止这种情况?
答案 0 :(得分:1)
为避免明确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;
希望这可以帮助你。