我知道从关系表中删除一直是一个问题,所以我在互联网上搜索以找到一个好的答案,但我尝试了大多数方法,它们对我不起作用,所以我希望我的问题不会被重复。
所以,我有两个具有一对一关系的实体。每个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();
}
谢谢;
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,它们通