JPA:关于删除cascade @OneToMany关系EclipseLink

时间:2016-05-01 16:54:28

标签: java database jpa eclipselink derby

我有这两个实体类:

@FXML
private void handleButtonAction(KeyEvent event) {
    // ...
}

@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;
    //...
}

我有一些帖子附加到同一个用户。如果我删除其中一个,它就可以了。但是当我尝试从数据库中删除该用户(使用EntityManager)时,我得到java.sql.SQLIntegrityConstraintViolationException外键违规限制。 有没有办法在删除用户(他们的外键)时删除所有帖子?只需@Entity @Table(name = "POST") @XmlRootElement public class Post implements Serializable { // ... @JoinColumn(name = "USERNAME", referencedColumnName = "USERNAME") @ManyToOne private User username; //... } SQL语句。 我正在使用Derby(Java DB)和EclipseLink。从JPA Extensions for EclipseLink添加那些ON DELETE CASCADE注释是我尝试过的最后一件事,但根本没有成功。

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

@CascadeOnDelete

并且,在超类中:

@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();

}

1 个答案:

答案 0 :(得分:0)

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