JPA已删除实体在JoinColumn上重新创建实体

时间:2015-01-16 15:22:12

标签: java jpa eclipselink

我在另一个实体上有一个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
  3. 问题在于步骤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不足以阻止这种情况?

1 个答案:

答案 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;

希望这可以帮助你。