Java Hibernate注释映射,JPA孤立删除
我正在尝试处理类别和发布类(OneToMany)之间的关系,需要删除属于特定类别的所有发布。 我不知道是否缺少一些注释,但这是我执行查询时的错误: org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法 执行更新查询 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) javaservlet.http.HttpServlet.service(HttpServlet.java:618) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javaservlet.http.HttpServlet.service(HttpServlet.java:725) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.hibernate.exception.ConstraintViolationException:无法 执行更新查询。 org.postgresql.util.PSQLException:错误:更新或删除表 “类别”违反表上的外键约束“fkf5bea17d42c4af41” “发布”详细信息:键(id)=(190)仍然引用自 表“出版物”。 我的源代码如下: 类别类别:Java Hibernate注释映射,JPA孤立删除,java,hibernate,jpa,hibernate-annotations,Java,Hibernate,Jpa,Hibernate Annotations,我正在尝试处理类别和发布类(OneToMany)之间的关系,需要删除属于特定类别的所有发布。 我不知道是否缺少一些注释,但这是我执行查询时的错误: org.springframework.web.util.NestedServletException:请求 处理失败;嵌套异常是 org.hibernate.exception.ConstraintViolationException:无法 执行更新查询 org.springframework.web.servlet.FrameworkServle
@Entity
@Table(name = "category")
public class Category {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String description;
@OneToMany(mappedBy="category", orphanRemoval=true)
private List<Publication> publications;
// Getters and Setters
}
要删除类别的查询:
@Override
public void deleteCategory(int id) {
sessionFactory.getCurrentSession()
.createQuery("DELETE FROM Category WHERE id="+id).executeUpdate();
}
提前感谢大家。您需要将删除操作级联到出版物:
@OneToMany(mappedBy="category", orphanRemoval=true, cascade = CascadeType.ALL)
private List<Publication> publications;
@OneToMany(mappedBy=“category”,orphanRemoving=true,cascade=CascadeType.ALL)
私人名单出版物;
编辑: 由于添加级联并不能解决问题,而且您正在使用Hibernate,因此为级联添加特定于Hibernate的注释可能会有所帮助。在这种情况下,您不需要上面的JPA参数:
@OneToMany(mappedBy="category", orphanRemoval=true)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Publication> publications;
@OneToMany(mappedBy=“category”,orphan=true)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
私人名单出版物;
这打破了对不同对象关系映射框架的可移植性,因为它不再是纯粹的JPA,但它在过去的某些情况下对我有所帮助。即使您将级联放在一起,它也不会工作。我从您的问题中了解到,您希望删除某一类别的所有出版物,然后您的查询应更改为以下内容。(您之前试图删除类别) 然后,如果您还想删除
类别
。(现在可以安全地删除类别,因为出版物
表中没有引用
delete from Category c where c.id = :categoryId;
发布异常的完整堆栈跟踪。@Chaitanya,谢谢你的回答,请再次检查我的问题。我添加了一个使用Hibernate特定的
级联注释的解决方案-我希望它能有所帮助。
delete from Publication p where p.category.id = :categoryId;
delete from Category c where c.id = :categoryId;