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

Hibernate Jpa 删除关系行失败

诸葛令
2023-03-14

我知道从关系表中删除一直是一个问题,所以我在互联网上搜索以找到一个好的答案,但我尝试了大多数方法,它们对我不起作用,所以我希望我的问题不会被重复。

所以,我有两个具有一对一关系的实体。每个product_family可以有许多产品,所以如果我没有错,我的product_family就像父产品;

产品家庭实体

@Entity
@Table(name = "product_family")
public class ProductFamilyEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column
    private String name;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "productFamilyEntity", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ProductEntity> productEntityList = new ArrayList<ProductEntity>();

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<ProductEntity> getProductEntityList() {
        return productEntityList;
    }

    public void setProductEntityList(List<ProductEntity> productEntityList) {
        this.productEntityList = productEntityList;
    }
}

互联网上的大多数答案都建议使用CascadeType.all和orphanRemoval = true作为父实体类,我也做了同样的事情。

这里是ProductEntity类

@Entity
@Table(name = "product")
public class ProductEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column
  private String name;

  @Column
  private String code;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "product_family_id" , nullable = false)
  ProductFamilyEntity productFamilyEntity;

  @OneToMany(fetch = FetchType.LAZY , mappedBy = "productEntity",)
//  cascade = {CascadeType.REMOVE, CascadeType.PERSIST})
//  @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
    List<ReleaseEntity> releaseEntitySet = new ArrayList<ReleaseEntity>();

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getCode() {
    return code;
  }

  public void setCode(String code) {
    this.code = code;
  }

  public ProductFamilyEntity getProductFamilyEntity() {
    return productFamilyEntity;
  }

  public void setProductFamilyEntity(ProductFamilyEntity productFamilyEntity) {
    this.productFamilyEntity = productFamilyEntity;
  }

  public List<ReleaseEntity> getReleaseEntitySet() {
    return releaseEntitySet;
  }

  public void setReleaseEntitySet(List<ReleaseEntity> releaseEntitySet) {
    this.releaseEntitySet = releaseEntitySet;
  }

}

当我插入product_family时,我也可以轻松地删除它,除非它与某些产品相关。下面是我得到的错误:

nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not extract ResultSet

这是最后一个根引起的:

org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block
    org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2102)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1835)
    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
    org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:500)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:273)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79)
    org.hibernate.loader.Loader.getResultSet(Loader.java:2062)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1859)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
    org.hibernate.loader.Loader.doQuery(Loader.java:906)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:348)
    org.hibernate.loader.Loader.doList(Loader.java:2550)
    org.hibernate.loader.Loader.doList(Loader.java:2536)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2366)
    org.hibernate.loader.Loader.list(Loader.java:2361)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:495)
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:357)
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:198)
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1194)
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:268)
    ir.ntnaeem.automation.domain.abstractDao.PgsqlDao.selectAll(PgsqlDao.java:69)
    ir.ntnaeem.automation.controller.lm.ProductFamilyController.productFamilyList(ProductFamilyController.java:48)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:497)
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107

有人能帮我吗?

我的依赖版本如下:

        <dependency>
            <groupId>og.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.2.16.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>

我使用的是postgresqlV9.1。

这里还有我的DAO移除方法:

public void remove(long id) {
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        String query = String.format("DELETE FROM %s table WHERE table.id= :id", entityClassName);
        Query jpaQuery = em.createQuery(query);
        jpaQuery.setParameter("id", id).executeUpdate();
        tx.commit();
    }

谢谢;

共有1个答案

秦珂
2023-03-14

10 小时后我终于找到了答案,我发布了它,以便它可以帮助其他人。

问题是我的 DAO 删除方法。我曾经执行以下操作来删除产品家庭实体:

productFamilyDao.remove(id);

其中id是我的产品系列实体的ID。关键是,正如你在我的问题中看到的那样,我的删除方法可能也无法删除所有相关产品。我不太擅长数据库,我不确定它是否在做正确的事情,但对我来说,解决方案是:

ProductFamilyEntity productFamilyEntity = productFamilyDao.find(id);
productFamilyDao.remove(productFamilyEntity);

这样,您的产品家庭实体中就有所有相关产品列表,因此现在您可以轻松删除它们。这是我的方法:

public void remove(E entity) {

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        em.remove(entity);
        tx.commit();
    }

祝你好运;

注意

特别感谢@Neo在这里的回答,这不是确切的答案,而是解决方案的线索。

 类似资料:
  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 我有一个使用JParePository的Spring Boot项目。 我有两个实体,Threat和Dimension,在数据库中我有3个表:tbl_threat,tbl_dimension和tbl_threat_dimension(它关系到每个威胁的维度) 我想删除thread_dimension表中的一个关系行。我该怎么解决这个?

  • 问题内容: 在一个模型中,我有这个: 如果我选择: 有用。 如何从关系中删除所有对象?不管用。 问题答案: 首先,你需要使用或来清除关系,根据docs,哪种更适合你的需求。 之后,你需要使用删除对象。方法。

  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

  • 在一个理论实体中,我有这样的配置: 当我删除实体时,它会尝试首先删除表,而不是连接的表,因此我会得到以下错误:

  • 我在删除子实体项目时遇到问题。每次我删除它的时候,什么都没有发生,父节点和子节点之间的关联仍然存在。我在网上搜索过,有些人建议使用orphanremoval,但我试过了,没有用。如果任何人可以建议,不胜感激。我的代码如下: 资产实体 (CHILD) 是单向关系,因此资产实体不包含任何@ManyToOne 在我的 SQL 数据库表中,我的关系CLIENTPROFILE_CLIENTASSET,它们通