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

标签 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

问题出在步骤 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/

相关文章:

java - EclipseLink 在 Oracle DB 上生成重复的主键

hibernate - 在 EclipseLink 中映射列名和表名

java - 如何编写 JSTL 而不是 Scriplet 来获取用户 Session?

java - 在java中向当前时间戳添加10分钟,但剪辑毫秒不起作用

java - 将字符串数组转换为字节数组(java)

java - 根据外键值选择结果

java - 一个 ArrayList 可以保存多少个值?

java - 期待 IDENT,在第 1 行附近发现 '*'

java - JPA 使用 Map 谓词 ManyToMany

java - 在更改和重新加载时 Play Framework 并出现 eclipselink 错误