我有这两个实体类:
@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();
}
答案 0 :(得分:0)
我们可以尝试将ON DELETE SET NULL子句添加到POST表中的外键约束中。当删除父表中的数据时,这将有助于将子表中的相应记录设置为NULL。因此,如果从用户表中删除用户名值,则POST表中使用此用户名的相应记录将用户名设置为NULL。