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

JPA Hibernate Spring OneToMany删除级联

方寒
2023-03-14

我读过一些相关的问题,但它们和我的问题不完全一样。

我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。

我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。

类似的东西:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;
    ...
}

这样会得到一张桌子:

Foo id    parent_id
1
2         1 
3         1

当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且parent_id=3的元素也会被删除)。

对于一些限制,我只能在儿子的身边与parent_id有关系。

我的问题是:使用JPA或Hibernate配置是否可以做到这一点,或者我是否需要执行一些递归函数来删除所有子级和所有父级?

我试过:

@OneToMany(name = "PARENT_ID", cascade = CascadeType.REMOVE)

我已经读过也许使用Hibernate注释。

如果有人能给我一些线索,我现在迷路了。

是否可以做到像这样:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name="PARENT_ID")
    private Foo parentNode;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "parentNode", cascade = CascadeType.REMOVE, orphanRemoval = true)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

保持表原样,fk为父级?我已经尝试过了,但我一直收到相同的错误,违反了fk限制。

最后解决了:

@Entity
class Foo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Foo parentNode;

    @OneToMany(mappedBy = "parentNode", cascade = CascadeType.REMOVE)
    private Set<Foo> childs = new LinkedHashSet<Foo>();
    ...
}

即使我们通过仅引用父 id 在 BBDD 中进行映射,也需要此@OneToMany

现在,当我们删除带有孩子的Foo时,它的子项也将被删除。

感谢您的时间和好的建议!

共有2个答案

莫兴言
2023-03-14

JPA 中的关系始终是单向的,除非您在两个方向上将父级与子级相关联。从父级到子级的级联 REMOVE 操作将需要从父级到子级的关系(而不仅仅是相反)。

所以这里需要将单向关系改为双向关系。

更多详情请参考此链接。

宗冠宇
2023-03-14

查看孤儿删除选项:

@OneToMany(cascade = CascadeType.REMOVE, orphanRemoval = true)

这里是关于<code>CascadeType的完整说明。移除和orphanRemove

祝你好运

 类似资料:
  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 级联删除通常被用作数据库术语,用来描述删除一个数据行时自动删除关联的数据行的特征。EF Core 实现了一些不同的删除行为,并且允许对关联关系的删除行为进行配置。EF Core 还实现了相关的惯例,它会基于关系的必要性为每个关系配置有用的默认删除行为。 删除行为 删除行为是在 DeleteBehavior 枚举中定义的,可以将它传递给 OnDelete 流式 API 来控制主实体/父实体的删除是否

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此

  • 问题内容: 我的模型与模型有关系。我已指定该关系应级联删除操作。但是,当我查询和删除用户时,出现一个错误,指出仍在引用地址行。如何删除用户和地址? 问题答案: 你有以下… 请注意,在“过滤器”之后,您仍然返回Query对象。因此,当您调用时,您正在调用Query对象(而不是User对象)。这意味着您正在执行批量删除(尽管可能只删除了一行) 您正在使用的方法的文档说… 该方法不提供Python中的级

  • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

  • 问题内容: 我有两个像这样的表: 因此,逻辑很简单,用户删除了类别x下​​的所有书籍,从猫中删除了x之后,我尝试了上述方法,但不起作用,在我清理了表格书籍后,表格类别仍被填充,这是怎么回事? 问题答案: 具有级联删除功能的外键意味着,如果删除父表中的记录,则子表中的相应记录将被自动删除。这称为级联删除。 您说的是相反的意思,这不是当您从子表中删除时会将记录从父表中删除。 ON DELETE CAS