【问题标题】:JPA: On delete cascade @OneToMany relationship EclipseLinkJPA:关于删除级联@OneToMany 关系 EclipseLink
【发布时间】:2016-05-01 16:54:28
【问题描述】:

我有这两个实体类:

@Entity
@Table(name = "USER")
@XmlRootElement
@CascadeOnDelete
public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 15)
    @Column(name = "USERNAME")
    private String username;
    //...
    @OneToMany(mappedBy = "username", cascade = CascadeType.ALL, orphanRemoval=true)
    @CascadeOnDelete
    private Collection<Post> postCollection;
    //...
}

还有:

@Entity
@Table(name = "POST")
@XmlRootElement
public class Post implements Serializable {
    // ...
    @JoinColumn(name = "USERNAME", referencedColumnName = "USERNAME")
    @ManyToOne
    private User username;
    //...
}

我有一些帖子附加到同一个用户。如果我删除其中一个,它就可以正常工作。但是当我尝试从数据库中删除该用户(使用 EntityManager)时,我得到 java.sql.SQLIntegrityConstraintViolationException 外键违规限制。 当用户(他们的外键)被删除时,有没有办法删除所有这些帖子?只需一个ON DELETE CASCADE SQL 语句。 我正在使用 Derby (Java DB) 和 EclipseLink。从 JPA Extensions for EclipseLink 添加 @CascadeOnDeleteannotations 是我尝试的最后一件事,但完全没有成功。

编辑: 这是我用于删除用户的代码(它是一个 REST API)

@DELETE
@Path("{id}")
public Response remove(@PathParam("id") String id) {
    User u;
    if((u = super.find(id)) == null)
        return Response.status(Response.Status.NOT_FOUND).build();
    super.remove(u);
    return Response.status(Response.Status.NO_CONTENT).build();

}

并且,在超类中:

public void remove(T entity) {    
    getEntityManager().remove(getEntityManager().merge(entity));
}

【问题讨论】:

  • 有了你所拥有的映射,它应该会自动发生,因为你有 cascade = ALL。删除用户应删除其帖子。你的代码是什么?
  • 在这种情况下,您可能有其他外键指向您要删除的用户。阅读错误消息:它应该提到外键名称。
  • 如果您指定 CascadeOnDelete 注释,您是使用 JPA 创建表,还是您自己将 ON DELETE CASCADE 添加到 Post 表约束?此注释告诉 EclipseLink 数据库将删除引用的 Post 实体,因此它不会,并且可能会导致您的异常。

标签: java database jpa eclipselink derby


【解决方案1】:

我们可以尝试将 ON DELETE SET NULL 子句添加到 POST 表中的外键约束。这将有助于在删除父表中的数据时将子表中的相应记录设置为 NULL。因此,如果从用户表中删除用户名值,则使用此用户名的 POST 表中的相应记录将用户名设置为 NULL。

【讨论】:

    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多