Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate注释映射,JPA孤立删除_Java_Hibernate_Jpa_Hibernate Annotations - Fatal编程技术网

Java Hibernate注释映射,JPA孤立删除

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

我正在尝试处理类别和发布类(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)仍然引用自 表“出版物”。

我的源代码如下:

类别类别:

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