没有事务的 JPA 更新查询 - 事务是强制性的吗?

2024-01-20

我正在尝试使用 JPA 通过本机查询进行插入,但我不想创建事务:

Query query = em.createNativeQuery("INSERT INTO person (id, firstname, lastname) VALUES ('1','Ronnie','Dio')");
int count = query.executeUpdate();

这最终会出现 TransactionRequiredException:

javax.persistence.TransactionRequiredException: Executing an update/delete query

at org.hibernate.ejb.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:99)

但是,如果我打开 Hibernate 会话并执行相同的查询 - 它会起作用:

Session session = em.unwrap(Session.class);
Query query = session.createSQLQuery("INSERT INTO person (id, firstname, lastname) VALUES ('1','Ronnie','Dio')");
int count = query.executeUpdate();

所以我的问题是 - 我在第一个示例中做错了什么?在 JPA 中执行插入/更新/删除查询真的需要事务吗? 如果是,是否有任何明确指定的文档链接?如果不是——我做错了什么?


看来您正在构建一个不在支持的容器内运行的应用程序JTA托管交易。在这样的环境中,您必须自己处理/管理事务,即您必须控制事务何时打开、提交或回滚。这种情况被称为资源本地实体管理器.

在部分7.5.2资源本地EntityManager官方的JPA 2.2 规范 https://raw.githubusercontent.com/javaee/jpa-spec/master/jsr338-MR/JavaPersistence.pdf(第 345 页)我们发现:

实体管理器,其事务由应用程序通过以下方式控制EntityTransactionAPI 是一个资源本地实体管理器。映射资源本地实体管理器事务 持久性提供者对资源进行的资源事务。资源本地实体管理器 可能使用服务器或本地资源连接到数据库并且不知道 JTA 的存在 交易可能活跃也可能不活跃

在规范文档的更下方EntityTransaction给出了接口。它可以让你打电话

  1. begin() to “启动资源交易”
  2. commit() to “提交当前资源事务,写入任何 未刷新对数据库的更改。”
  3. rollback() to “回滚当前资源事务。”以防在提交更改时数据库端出现问题。

这是理论部分。 对于您的代码示例,您可能希望将其更改如下:

EntityTransaction tx = null;
try {
    tx = em.getTransaction();
    // start a new transaction, i.e. gather changes from here on...
    tx.begin();

    // do your changes here
    Query query = em.createNativeQuery("INSERT INTO person (id, firstname, lastname) VALUES ('1','Ronnie','Dio')");
    int count = query.executeUpdate();

    // write changes to database via commit
    tx.commit();
} catch(RuntimeException re) {
    if(tx != null && tx.isActive()) {
        // ensure no semi-correct changes are pending => cleanup
        tx.rollback();
    }
    // handle exception, log it somewhere...
}

这应该避免TransactionRequiredException你遇到。此外,您应该避免使用createNativeQuery,因为您错误地使用了对象关系映射器(ORM)的基本概念,即映射器会将对象转换为元组,反之亦然。一般来说,这应该可以减轻为大量域实体编写插入/更新查询的痛苦。

看一下部分3.1.1 EntityManager接口(第 65 页)上面链接的规范文档并使用这些方法

  • persist(..) - “使实例成为托管且持久的实例。” or
  • merge(..) - “将给定实体的状态合并到当前的持久性上下文中。”

有关两种方法差异的更多信息,请参阅帖子here https://stackoverflow.com/q/1069992/2849346 and here https://stackoverflow.com/a/4509389/2849346.

希望能帮助到你。

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

没有事务的 JPA 更新查询 - 事务是强制性的吗? 的相关文章

随机推荐

  • 在 python 中执行 bash 脚本

    我创建了一个 Expect 脚本 执行时 它会通过 ssh 连接到服务器并执行一系列命令 伪代码如下所示 usr bin expect spawn ssh usr myip expect password send mypassword n
  • Web Workers 是沙箱不受信任的 JavaScript 代码的安全方法吗

    我想知道网络工作者是否可以安全地沙箱不受信任的 JavaScript 代码 举例来说 在绘图应用程序的上下文中 开发人员可以实现新的绘图工具 您可以将他们的代码放入 webworker 中 并且每当用户单击画布时 向他们发送一条包含光标位置
  • Python argparse:列出用法中的各个选择

    我有一个需要多个参数的程序 例如 breakfast py customer vikings eggs sausage bacon 其中 鸡蛋 香肠 和 培根 可以从特定选项列表中指定 现在我喜欢的输出breakfast py help看起
  • Azure Cosmos DB 多模型意味着什么?

    看着新的 Azure cosmos 数据库 我对它的多模型性质有点困惑 具体来说 是不是意味着 a 可以同时以多种方式查询相同的底层数据库 存储 以便我可以针对相同的集合使用 gremlin 图形查询和 mongodb api or b 这
  • 网页到印刷媒体——解决方案?

    我一直是 MediaWiki 和类似的基于 wiki 的文本编辑器的忠实粉丝 我喜欢快速添加文本 协作和共享的功能 然而 仍然需要格式良好的打印输出 像页眉和页脚 表达我想要它们表达的内容 分页符 页边距等 我见过的大多数解决方案都涉及到某
  • 在 SceneKit 中使用 Metal 着色器

    我想用一个Metal着色器将卡通 单元着色应用于场景中使用的材质 我试图实现的着色器是苹果自己的AAPLCelShader发现于金属着色器展示柜 https developer apple com library ios samplecod
  • 如何动态更改结构体的 json 标签?

    我有以下内容 package main import encoding json fmt os reflect type User struct ID int64 json id Name string json first want to
  • 我应该如何设置CLASSPATH?

    我之前这样做过 CLASSPATH home phenies jdk1 6 0 17 lib tools jar home phenies jdk1 6 0 17 lib dt jar 但今天一篇文章说我应该这样做 CLASSPATH ho
  • Pandas:将 group-key 作为 groupby.apply 中函数的参数

    我正在处理数据集df cities包含以下列 city name country name population language 我有以下函数可以根据国家 地区是否在某个列表中对表进行排序 special countries Morocc
  • 使用 ifelse 转换 R 中的列

    我有一个带有一列数字的数据框 在单独的列中 我想根据数字打印该数字是 小于 10 10 到 20 之间 还是 20 到 30 之间 到目前为止 我已经生成了这段代码 但到目前为止还不起作用 任何人都可以建议我如何修改它以使其起作用吗 cre
  • 添加 AUC 作为 keras 的损失函数

    有没有人有幸使用 Theano 为 Keras 编写自定义 AUC 损失函数 文档在这里 http keras io objectives http keras io objectives 示例代码在这里 https github com
  • 创建并写入具有“执行”权限的文件?

    我正在写一个bash带飞镖的脚本 下面的代码创建一个文件 但该文件没有 执行 权限 所以我无法通过执行 ex sh new File ex sh writeAsStringSync script str 也许 我需要设置FileStat h
  • 无法在未调用 Looper.prepare() 的线程内创建处理程序

    以下异常是什么意思 我该如何修复它 这是代码 Toast toast Toast makeText mContext Something Toast LENGTH SHORT 这是例外 java lang RuntimeException
  • 正则表达式更改特定字符串[重复]

    这个问题在这里已经有答案了 我正在从事一个翻译项目 当用户输入时我必须更改一些单词 例如 亚拉玛 gt 亚拉玛 亚拉马克 gt 亚拉马克 卡尔马迪 gt 卡马迪 萨拉马迪 gt 萨拉马迪 我的代码目前运行良好 但我有一个问题 如果我只输入
  • 从简单的 XML 文件到 XForms 的 XSL 转换并应用 CSS

    我正在将一些简单的 XML 文档转换为 XForms 并尝试向最终结果添加一些样式 我正在使用XSLT表格实现 我指向本地 CSS 文件 Twitter 的引导程序 所以 XML 文件看起来像这样
  • 为什么 new HashMap<> 在 JDK 1.6 中会产生错误,而在 1.7 中不会

    我注意到以下代码在使用 java 规范 1 7 的 eclipse 中编译时可以工作 但不能在 1 6 下工作 HashMap
  • 如何创建类的实例并注入服务?

    新的 aspnet 具有内置依赖注入 启动类实例接收服务 控制器 视图组件 有什么方法可以让我创建我的类的对象并使用 aspnet 功能传递服务吗 就像是 WebApplicationClassesActivator Create type
  • 无法在 Angular 9 中进行默认导入

    我变了tsconfig json通过添加此属性 esModuleInterop true allowSyntheticDefaultImports true 为了能够导入 npm 包import as ms from ms 但我仍然收到此错
  • 如何从 .sikuli 文件夹中检索代码?

    当我打开一个 sikuli文件夹 里面只有图像 所以我想知道是否有任何方法可以在不使用 Sikuli IDE 的情况下查看或检索 Sikuli 代码 我可以从 sikuli文件夹 根据文档 http doc sikuli org devs
  • 没有事务的 JPA 更新查询 - 事务是强制性的吗?

    我正在尝试使用 JPA 通过本机查询进行插入 但我不想创建事务 Query query em createNativeQuery INSERT INTO person id firstname lastname VALUES 1 Ronni