【发布时间】: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