繁体   English   中英

JPA:在删除级联@OneToMany关系EclipseLink上

[英]JPA: On delete cascade @OneToMany relationship EclipseLink

我有以下两个实体类:

@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添加这些@CascadeOnDelete批注,但没有成功。

编辑:这是我用于删除用户的代码(它是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));
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM