当前位置: 首页 > 知识库问答 >
问题:

Hibernate注释映射,JPA 孤立删除

徐飞尘
2023-03-14

我试图在类别和发布类(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: ERROR: update or delete on table “category” 違反了表 “publication” 上的外键约束 “fkf5bea17d42c4af41” 詳細: Key (id)=(190) 仍從表 “publication” 引用。

我的源代码如下:

类别类:

@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();
}

提前感谢大家。

共有2个答案

蔚承天
2023-03-14

即使你放了级联,它也不会起作用。我从您的问题中看到,您想删除所有属于特定类别的出版物,然后您的查询应更改为以下内容。(您之前尝试删除类别)

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

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

delete from Category c where c.id = :categoryId;
农鸿达
2023-03-14

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

@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生成一些带有外键的表等等。我将给出我希望hibernate生成的查询的一个示例: 所以这个查询应该由hibernate通过注释生成。与此对应的类是: 有关中的应映射到的内容的示例(中的每个助记符在中只有一个值): 正如您所看到的,我在文档的帮助下做了一些尝试,但是我不能让Hibernate生成外键。如果有人能告诉我这个类需要的注释和值,那就太好了,这样我就可以自己为其他类做

  • 问题内容: 我在使用带有以下映射的JPA删除孤立节点时遇到问题 我遇到了孤立角色挂在数据库周围的问题。 我可以使用特定于注释的Hibernate标记,但是显然我不想将解决方案绑定到Hibernate实现中。 编辑:似乎JPA 2.0将包括对此的支持。 问题答案: 如果将它与Hibernate一起使用,则必须显式定义批注,该批注可与JPA结合使用。 如果你不打算使用,则必须先明确删除子元素,然后再删

  • 问题内容: 几天前,我开始与Hibernate合作时,我只是想知道:假设您正在从头开始一个项目。您是否将使用基于注释的映射或Hibernate映射文件来生成数据库模式。 据我了解,Hibernate映射文件提供了一些注解所没有的功能(至少不是完全等效的功能)。但是,我仍然感觉到,如今,使用Hibernate的项目宁愿基于注释而不是Hibernate映射文件。 有没有人选择过注解上的映射文件,如果是

  • 我有三个表:用户,角色,董事会。每个用户可以有多个板,但在一个板中用户只能有一个角色。我创建了三个类并添加了注释: Hibernate创建一个新表,如下所示: 我使用的是hibernate 4.2.2。

  • 问题内容: 我的问题围绕着我想用JPA映射的以下结构: 我的POJO非常简单(没有复合类型等,只有一些原语)。 如何在链接的问题中实施建议?我该如何仅用部分进行注释(当我仅对字段进行注释时,会发生类转换错误,因为HashMap无法转换为Blob,这是问题的根源- 我不能仅对值部分进行注释地图)? 我不确定是否需要使包装类型实现实现可包装List的Serializable,还是仅使用ArrayLis

  • 我有这些桌子: 由该类表示: 原因:org.hibernate.mappingException:无法确定:java.util.map的类型,位于表:product,列:[org.hibernate.mapping.simplevale.getType(simplevale.java:349)位于org.hibernate.mapping.simplevale.isvalid(simplevale