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

删除父实体时不删除子实体

阮俊弼
2023-03-14

删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。

当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么?

这是我的父表:

@Entity
@Table(name = "TURTLE_LOOKUP")
public class TurtleLookup implements Serializable 
{

@Basic(optional = false)
@Column(name = "TURTLEID")
private int turtleid;

@Basic(optional = false)
@Column(name = "TURTLE")
private String turtle;

@OneToMany(mappedBy = "turtleType", cascade = CascadeType.REMOVE)
List<TurtleReview> turtleReviews;

...
}

这是我的子表:

@Entity
@Table(name = "TURTLE_REVIEW")
public class TurtleReview implements Serializable 
{

@Column(name = "TURTLE_REVIEW_ID")
private int turtleReviewId;

@Column(name = "TURTLE_YEAR")
private int turtleYear;

@ManyToOne(cascade = CascadeType.REMOVE, optional = false)
@JoinColumn(name = "TURTLE_ID", referencedColumnName = "TURTLEID")
private TurtleLookup turtleType;

@Column(name = "IS_COMPLETE")
private short isComplete;

...
}

编辑/更新:

如果我将CascadeType.REMOVE更改为CascadeType.ALL,则在删除父TurtleLookup实体对象时,TurtleRevkup实体将从数据库中成功删除。但是,当调用以下函数创建新的TurtleView实体对象时,JPA尝试将新的TurtleLookup实体插入到数据库中,这会引发异常:“条目已驻留在数据库中。事务回滚”。以下是创建新TurtleView实体时执行的代码。

public void setDatasetReviewComplete(TurtleLookup turtle, Short year, boolean isComplete)
{
TurtleReview turtleReview = getTurtleReview(turtle, year);
if (turtleReview == null)
{
turtleReview = new TurtleReview();
turtleReview.setTurtleYear(year)
turtleReview.setTurtleType(new a.b.entity.TurtleLookup(turtle.getId(), turtle.getValue()));
}
turtleReview.setIsComplete(isComplete ? (short)1 : 0);
entityManager.persist(turtleReview);
}

共有3个答案

毕衡
2023-03-14

尝试使用hiberNate@Cascade注解:

@Cascade(value = CascadeType.ALL)
@OneToOne(mappedBy = "turtleReview") // mappedBy name of TurtleRewiew object field in TurtleLookup entity class
private TurtleLookup turtleType;

如果你的关系是一对一,你就不能在另一边拥有一对多,也不能拥有<code>列表

@Entity
@Table(name = "TURTLE_LOOKUP")
public class TurtleLookup implements Serializable 
{

@Basic(optional = false)
@Column(name = "TURTLEID")
private int turtleid;

@Basic(optional = false)
@Column(name = "TURTLE")
private String turtle;

@OneToMany(mappedBy = "turtleType") // or add cascade = javax.persistence.CascadeType.ALL and remove @Cascade if you are not using hibernate
@Cascade(value = CascadeType.ALL) 
List<TurtleReview> turtleReviews;

...
}


@Entity
@Table(name = "TURTLE_REVIEW")
public class TurtleReview implements Serializable 
{

@Column(name = "TURTLE_REVIEW_ID")
private int turtleReviewId;

@Column(name = "TURTLE_YEAR")
private int turtleYear;

@ManyToOne
@JoinColumn(name = "TURTLE_ID", referencedColumnName = "TURTLEID")
private TurtleLookup turtleType;

@Column(name = "IS_COMPLETE")
private short isComplete;

...
}
慕胡媚
2023-03-14

你的域模型可能有问题,这是问题中遗漏的一部分。你可能有循环级联吗?如果你有一个循环级联,其中一些是CascadeType.REMOVE的,一些是CascadeType.PERSIST的,那么HiberNate(不确定其他JPA实现)就会做……当你调用删除()方法时什么也不做。没有错误或异常消息。

贾成天
2023-03-14

尝试将级联值更改为全部或全部删除孤立

@OneToMany(mappedBy = "turtleType", cascade = CascadeType.REMOVE)
List<TurtleReview> turtleReviews;

...
}
 类似资料:
  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 我用的是SpringBoot和JPA Hibernate。 我有这些实体: 当我尝试删除父实体(Post)时,所有相关实体注释都保留在数据库中。为什么级联删除不起作用?

  • 我正在尝试删除一个父/子自连接实体,但无法这样做,这里是我的映射

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 主要内容:JPA实体删除示例要从数据库中删除记录,可以使用接口提供方法。方法使用主键来删除特定的记录。 JPA实体删除示例 在这里,我们将演示如何根据主键删除指定学生的信息。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.