[英]Cascade persist error with JPA and EclipseLink on ManyToOne relationship
[英]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.