【问题标题】:Hibernate Annotation mapping, JPA Orphan DeleteHibernate Annotation 映射,JPA 孤儿删除
【发布时间】:2014-09-23 13:55:17
【问题描述】:

我试图建立类别和出版物类 (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) javax.servlet.http.HttpServlet.service(HttpServlet.java:618) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) javax.servlet.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” "publication" 详细信息:Key (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
}

出版类:

@Entity
@Table(name = "Publication")
public class Publication {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int id;
    private String title;
    private String content;

    @ManyToOne
    @JoinColumn(name = "id_category")
    private Category category;

    // Getters and Setters
}

查询删除类别:

@Override
public void deleteCategory(int id) {
    sessionFactory.getCurrentSession()
     .createQuery("DELETE FROM Category WHERE id="+id).executeUpdate();
}

提前谢谢大家。

【问题讨论】:

  • 发布异常的完整堆栈跟踪。
  • @Chaitanya,谢谢你的回答,请再次检查我的问题。

标签: java hibernate jpa hibernate-annotations


【解决方案1】:

您需要将删除操作级联到出版物:

@OneToMany(mappedBy="category", orphanRemoval=true, cascade = CascadeType.ALL)
private List<Publication> publications;

编辑:

由于添加级联没有解决您的问题并且您使用的是 Hibernate,因此添加 Hibernate 特定的注释以进行级联可能会有所帮助。在这种情况下,您不需要上面的 JPA 参数:

@OneToMany(mappedBy="category", orphanRemoval=true)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Publication> publications;

这破坏了对不同对象关系映射框架的可移植性,因为它不再是纯 JPA - 但它在过去的某些情况下对我有所帮助。

【讨论】:

  • 我添加了一个使用 Hibernate 特定的 Cascade 注释的解决方案 - 我希望它有所帮助。
【解决方案2】:

即使你把级联,它也行不通。我从您的问题中看到您想删除属于某个类别的所有出版物,那么您的查询应该更改为以下内容。 (您之前曾尝试删除类别)

delete from Publication p where p.category.id = :categoryId;

如果您还想删除Categories。 (现在您可以安全地删除类别,因为Publication 表中没有引用。

delete from Category c where c.id = :categoryId;

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2013-06-05
    • 2011-02-09
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多