首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate注释映射,JPA Orphan Delete

Hibernate注释映射,JPA Orphan Delete
EN

Stack Overflow用户
提问于 2014-09-23 13:55:17
回答 2查看 2.5K关注 0票数 1

我试图在类别和发布类(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“:key (id)=(190)仍然从表”发布“中引用。

我的源代码如下:

类别类别:

代码语言:javascript
复制
@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
}

出版类:

代码语言:javascript
复制
@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
}

查询删除类别:

代码语言:javascript
复制
@Override
public void deleteCategory(int id) {
    sessionFactory.getCurrentSession()
     .createQuery("DELETE FROM Category WHERE id="+id).executeUpdate();
}

先谢谢大家。

EN

回答 2

Stack Overflow用户

发布于 2014-09-23 14:09:01

您需要将delete操作级联到发布:

代码语言:javascript
复制
@OneToMany(mappedBy="category", orphanRemoval=true, cascade = CascadeType.ALL)
private List<Publication> publications;

编辑:

由于添加级联没有解决您的问题,而且您正在使用Hibernate,所以添加Hibernate特定的注释来进行级联可能会有所帮助。在本例中,您不需要上面提到的JPA参数:

代码语言:javascript
复制
@OneToMany(mappedBy="category", orphanRemoval=true)
@org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.ALL)
private List<Publication> publications;

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

票数 0
EN

Stack Overflow用户

发布于 2014-09-23 17:00:02

即使你把级联放进去,它也不起作用。我从你的问题中看出,你想删除属于某一类别的所有出版物,那么你的查询应该改为以下内容。(您之前试图删除类别)

代码语言:javascript
复制
delete from Publication p where p.category.id = :categoryId;

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

代码语言:javascript
复制
delete from Category c where c.id = :categoryId;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25996988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档