JPA Hibernate - 数据库和注释中的级联删除

2024-01-24

Brief

我想知道我应该做什么,因为我读过很多文章试图理解这一点,包括许多 SO 问题。我读过的任何一篇文章都没有击中要害。

我想知道当使用级联规则和应用程序定义数据库时会发生什么,因为这将定义我是否应该采用以下方法或其他方法。

示例表

create table foo(
  id int unsigned not null auto_increment,
  primary key(id)
);

create table bar(
  id int unsigned not null auto_increment,
  foo_id int unsigned not null,
  primary key(id),
  foreign key(foo_id) references foo(id) on delete cascade on update cascade
)

示例类

@Entity
@Table(name = "foo")
public class Foo {

  private int id;
  private List<Bar> bars;

  @Id
  @GeneratedValue
  @Column(name = "id")
  public int getId() {
    return id;
  }

  @OneToMany(mappedBy = "foo", cascade = {CascadeType.ALL})
  public List<Bar> getBars() {
    return bars;
  }

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

  public void setBars(List<Bar> bars) {
    this.bars = bars;
  }

}

@Entity
@Table(name = "bar")
public class Bar {

  private int id;
  private Foo foo;

  @Id
  @GeneratedValue
  @Column(name = "id")
  public int getId() {
    return id;
  }

  @ManyToOne
  @JoinColumn(name = "foo_id", nullable = false)
  public getFoo() {
    return foo;
  }

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

  public void setFoo(Foo foo) {
    this.foo = foo;
  }

}

问题

如果我现在调用删除操作(通过EntityManagerFactory or SessionFactory) on a Foo对象,下列哪一种情况会发生?

  1. hibernate操作会删除该目录下的所有记录bar桌子 其外键是Foo's foo_id然后删除 这Foo record.

  2. hibernate操作会删除所有对应的Bar已加载到会话缓存中的记录(其中 可能是也可能不是全部bar实际数据库中存在的记录)和 然后删除Foo记录(数据库级联规则将删除任何剩余的bar记录)。

  3. 休眠操作将尝试 删除Foo首先记录,如果数据库失败,则执行以下操作之一 上述步骤。

  4. 还有一些我没有考虑到的事情发生了,如果是的话怎么办?

考虑到以下困境假设,最好的方法是什么?

Dilemna

如果 1 为真,则表明:

A) 仅在数据库中定义级联规则。一定要删除bars从应用程序中的对象中分离出来,这样它们就不会与数据库分离(因为数据库将删除它们的记录),然后调用删除foo.

OR

B) 仅在应用程序中定义级联规则,因为它将彻底管理数据库完整性。

NOT

C) 在两者中定义级联规则,因为每个都实现了所需的结果,而使另一个浪费了处理。

如果 2 为真,则表明:

在数据库和应用程序中定义级联规则,以便 Hibernate 可以负责管理其实体,并且数据库可以在之后进行清理,因为应用程序不能保证删除所有实体bar记录。

如果 3 为真,则表明:

在数据库和应用程序中定义级联规则,因为 Hibernate 似乎支持已在数据库级别定义的级联规则。

如果 4 为真,则表明:

这个问题更加重要,因为我错过了一些基本的东西!

编辑:添加我读过的文章...

相关文章

数据库、应用程序或两者的视图相互冲突:

SO - 应该让 jpa 或数据库级联删除 https://stackoverflow.com/questions/5787551/should-i-let-jpa-or-the-database-cascade-deletions

数据库或应用程序的冲突视图:

SO - 使用 jpa 或数据库内部进行级联删除更新 https://stackoverflow.com/questions/554750/cascading-deletes-updates-using-jpa-or-inside-of-database

本文阐明了 JPA 提供程序的实际用途(尽管应该注意的是,他们使用 OpenJPA 提供程序进行操作证明):

jpa教程 http://meri-stuff.blogspot.co.uk/2012/03/jpa-tutorial.html

它指出:

删除和持久操作的级联也适用于那些 尚未加载的实体。它甚至穿过它们 其他实体,可能会遍历整个对象图。

它接着指出:

刷新、合并和分离的级联仅通过 已经加载的实体。

这意味着提议的流程 2 不正确。


如果您在数据库中声明级联并休眠,则数据库将始终首先删除(如果它支持),并且休眠调用不会真正删除任何内容,而是无论如何都会运行。然而,由于您使用的是 hibernate,它的主要优点是可以轻松过渡到可能不支持数据库端级联功能的新数据库。因此,即使您的数据库支持级联并且 hiberate 下划线 jdbc 语句当前没有执行任何操作(它们将来可能会执行某些操作),您也希望将它们留在那里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA Hibernate - 数据库和注释中的级联删除 的相关文章

  • 在 Java 中使用并行性会使程序变慢(慢四倍!!!)

    我正在编写共轭梯度方法实现 我使用 Java 多线程进行矩阵反向替换 使用CyclicBarrier CountDownLatch 进行同步 为什么同步线程需要这么长时间 还有其他方法吗 代码片段 private void syncThre
  • 如何在 JavaFX 中设置滚动窗格的单位增量?

    The 滚动条 http docs oracle com javafx 2 api javafx scene control ScrollBar htmlJavaFX 中的类包含一个用于设置单位增量的属性 这就是我所追求的 但是我找不到如何
  • 动态添加的 RemoteView 上的布局权重

    在我的小部件中 我使用以下内容将项目 R layout widget item 动态添加到我的主小部件布局中定义的 LinearLayout 中 Main widget layout RemoteViews views new Remote
  • 如何从号码选择器中跳过某些号码?

    选号器 np NumberPicker findViewById R id numberPicker1 np setMaxValue 200 np setMinValue 1 Button b Button findViewById R i
  • 如果主键不为空,Spring data JPA不允许实体被持久化

    我有一个订阅者实体 它使用用户提供的电子邮件地址作为主键而不是自动生成的值 这意味着当调用JpaRepository的save方法时 主键值为not null 春季数据JPA文档 http docs spring io spring dat
  • 在 Volley 中更新 UI 最有效的方法是什么

    最近我在 android 中使用 Volley 库 它工作得很好 但我想知道更新 UI 的最有效方法 我有一个包含所有 Volley 方法的 Utils 类 现在我传递了所有视图将作为参数更新 但我读到我可以在活动中实现侦听器 然后将它们作
  • R:连接到 Teradata 时 JDBC() 找不到 Java 驱动程序路径

    我正在尝试通过 RStudio 连接到 Teradata 但由于某种原因 JDBC 函数在识别 Java 驱动程序所在的路径时出现问题 请参阅下面的代码 library RODBC library RJDBC library rJava b
  • 在 Java 中,对复杂模型使用接口是否会带来性能提升?

    标题很难理解 但我不知道如何以另一种方式总结 欢迎任何澄清的编辑 我被告知并建议使用接口来提高性能 即使在并不特别需要常规 接口 角色的情况下也是如此 在这种情况下 对象是大模型 MVC 意义上的 具有许多方法和字段 向我推荐的 好用处 是
  • 如何生成0-8范围内除一个特定数字之外的随机数?

    我正在尝试开发 Tic Tac Toe 游戏 其中玩家 1 将单击一个按钮放置 X 稍后玩家 2 计算机 将在第一步中随机将 O 放置到其他按钮 为此 我需要创建一个随机数0 8 之间 除了玩家 1 点击的那个之外 我正在使用以下代码来生成
  • Kafka 0.10 Java 客户端超时异常:包含 1 条记录的批次已过期

    我有一个单节点 多 3 个代理 Zookeeper Kafka 设置 我正在使用 Kafka 0 10 Java 客户端 我编写了以下简单的远程 在与 Kafka 不同的服务器上 生产者 在代码中我用 MYIP 替换了我的公共 IP 地址
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • 手写签名对比

    有谁知道java中一种将手写文本样本 例如签名 亲笔签名等 与一个或多个样本进行比较的方法 最好是开源的 你可以看看这个OCR小程序 http www heatonresearch com articles 42 page1 html
  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • 信号量如何工作?

    信号量可以小于0吗 我的意思是 假设我有一个 N 3 的信号量 并且我调用 down 4 次 那么 N 将保持为 0 但一个进程将被阻塞 反之亦然 如果一开始我调用 N 可以大于 3 吗 因为在我看来 如果 N 可以高于 3 如果一开始我调
  • 使用您正在散列的内容的散列作为盐?

    假设用户注册了您的网站 您对他们选择的密码进行哈希处理 然后使用该哈希值作为盐 并使用该盐重新哈希其密码 Example String hash1 MD5 password String endHash MD5 hash1 password
  • 在实时计算机上更新(或替换)整个数据库表的最佳方法是什么?

    我每周都会收到一个数据源 我将对其进行解析并放入数据库中 数据每周不会有太大变化 但我应该定期更新数据库 除了每周更新外 数据是静态的 目前重建整个数据库不是问题 但最终该数据库将上线 人们可以在我重建数据库时查询该数据库 数据量并不小 几
  • Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?

    通过使用 selenium 我可以访问位于检查选项卡中的浏览器元素选择器 在浏览器中按 Ctrl Shift C 吗 我想使用该选择器 指向 一个元素 并使其在浏览器中突出显示 例如 简单的事情如下 WebElement elem driv
  • a.equals(a) 什么时候返回 false?

    我想知道在哪些情况下java中的变量不能相等 使用equals 方法 自身 我这里说的不是对象而是变量本身 只要代码编译并在调用 equals 时返回 false 到目前为止 我发现的唯一情况是 public class A public
  • Java/Android 字符串到颜色的转换

    我正在制作一个应用程序 我希望能够通过用户输入 edittext 和十六进制值设置各种颜色 例如 eeeeee等等 问题是我似乎不知道如何转换它们 如果我在代码中做这样的事情 它工作得很好 标题栏 setBackgroundColor 0x

随机推荐

  • 在python3 asyncio中使用串口

    我正在尝试 但到目前为止 未能使用 python asyncio 访问串行端口 我真的很感激关于在简单的 fd 上使用新的 python 异步框架的任何提示 Cheers James 这是一个使用的工作示例pyserial异步 https
  • C# 中 CreateObject 的等效代码

    我有一个VB6代码 谁能告诉我怎么写C 这段代码如下 Set Amibroker CreateObject Broker Application Set STOCK Amibroker Stocks Add ticker Set quote
  • 循环提示输入另一个密码时出现问题

    我需要一些关于 EXPECT 脚本的帮助 我正在尝试在访问大量主机之前自动登录 并在用户错误输入密码时进行处理 我首先获取用户名和密码 然后针对特定主机对其进行验证 如果密码无效 我想循环并再次询问用户名和密码 我正在尝试这个 省略前面几行
  • 当我运行代码时,我得到一个奇怪的输出(在问题中列出)。我该怎么办? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 from turtle import Turtle Screen timmy the turtle Turtle timmy the tur
  • 合并两个具有不同列数的表

    我有两张表 表 A 和表 B 它们具有不同数量的列 假设表 A 有更多列 如何合并这两个表并为表 B 没有的列获取 null 对于具有较少列的表 将额外的列添加为空 例如 Select Col1 Col2 Col3 Col4 Col5 fr
  • Hilt ViewModel 没有零参数构造函数

    Cannot create an instance of class com comp app winners WinnersViewModel Caused by java lang InstantiationException java
  • 如何收到从 SD 卡删除任何文件的通知

    我想创建Dumpster https play google com store apps details id com baloota dumpster像应用程序一样 为此我希望在用户删除任何文件时收到通知 以便我可以将其保存到我的应用程
  • 如何使用多个数组创建 JSON 对象?

    我以前从未使用过 JSON 所以我不熟悉它的语法 目前我有多个包含不同数据的数组 我想创建一个 JSON 对象 其中包含多个数组 每个数组都有几条数据 E g 一个名为 cars 的对象 包含多个数组 每个数组对应不同品牌的汽车 每个数组中
  • ASP.NET Core MVC 应用程序中的 Microsoft LocalReport (rdl)

    我正在使用 ASP NET Core 2 1 MVC 运行一个项目 在我们公司 我们确实使用 SQL Report Builder rdlc 和 rdl 文件 完成了大量工作 因此 我们希望在 ASP NET Core MVC Web 应用
  • 如果弹出窗口

    有没有办法判断当前窗口是否是弹出窗口 这就是我现在所拥有的 但由于某种原因它不起作用 我试图确保某些页面仅显示在弹出窗口中 if opener window location error php 即使窗口没有弹出 opener 的值也是 o
  • ColdFusion 在字符串中构造数据库查询时添加额外的引号

    我正在 ColdFusion 中编码 但试图留在 cfscript 中 所以我有一个函数允许我传入一个查询来运行它
  • 如何将 Tensor 转换为 ndarray(里面有对抗性图像的张量)

    注意 我已经尝试过不同 SO 问题的解决方案 但没有成功 详细信息如下 我正在学习克莱尔汉斯Python 教程 重点关注this https github com tensorflow cleverhans blob master clev
  • AWS Lambda 上的 Python:来自 botocore.vendored 的“请求”已弃用,但“请求”不可用

    我有一个用于 AWS Lambda 函数的 Python 脚本 该函数向另一个端点发出 HTTP POST 请求 自从Python的urllib2 request https docs python org 2 library urllib
  • 生成唯一的随机字母数字字符串

    我正在开发一个应用程序 允许用户共享简单调查的链接 为此 我想为每个调查生成唯一的 URL 因此具有如下 URL http myapp com aBcDe1F 我希望 URL 的字母数字标识符部分是伪随机的并且有点短 6 8 个字符 现在
  • Highcharts 异步钻取

    我正在关注http jsfiddle net gh get jquery 1 7 2 highslide software highcharts com tree master samples highcharts drilldown as
  • lambda 表达式的扩展方法

    我有一个辅助方法 它获取由 lambda 定义的属性的名称 其工作原理如下 ExpressionUtil GetName Thing t gt t Property returns Property 我想将其转换为扩展方法 因此语法将采用以
  • 在 Linq 中处置 IDisposable

    这是对答案的评论的后续this https stackoverflow com questions 1751153 how do you dispose of idisposableobject create inside of a lin
  • 如何以 Rails 形式处理多个模型

    http weblog rubyonrails org 2009 1 26 nested model forms http weblog rubyonrails org 2009 1 26 nested model forms 这篇文章有助
  • 如何创建 Gmail 插件? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何创建 Gmail 插件 我没有找到任何 API 可以做到这一点 Gmail 终于在 2017 年 10 月支持了 ADD ONS
  • JPA Hibernate - 数据库和注释中的级联删除

    Brief 我想知道我应该做什么 因为我读过很多文章试图理解这一点 包括许多 SO 问题 我读过的任何一篇文章都没有击中要害 我想知道当使用级联规则和应用程序定义数据库时会发生什么 因为这将定义我是否应该采用以下方法或其他方法 示例表 cr