Hibernate/JPA 中批量插入 CollectionTable 元素

2024-02-10

我们使用 Hibernate 4.2 作为 JPA 2.0 实体的支持库。我们有一个如下所示的实体:

@Entity
public class MyEntity {
    ....
    @ElementCollection
    @MapKeyColumn(name = "key")
    @Column(name = "value")
    @CollectionTable("MyEntityMap")
    private Map<String, Integer> theMap;
    ...
}

该地图可能有数千个条目。我已经设定hibernate.jdbc.batch_size=50,但是当我说时,Hibernate 仍然会为映射中的每个条目生成一条插入语句entityManager.persist(myEntity)。有没有办法让 Hibernate 在批量插入中插入值INSERT INTO MyEntityMap () VALUES (), (), (), (), ()?


我有完全相同的场景,这就是我最终所做的......

在 persistence.xml/equivalent 文件中使用以下配置

<property name="hibernate.jdbc.batch_size" value="10"/> 
<property name="hibernate.order_inserts" value="true"/> 
<property name="hibernate.order_updates" value="true"/>

您给出的示例是批量插入,上面的配置所做的只是将各个插入语句作为单个批次发送到数据库,它实际上并没有将插入重写到

INSERT INTO MyEntityMap () VALUES (), (), (), (), ()

诚然,批量插入只能带来轻微的性能改进,真正的性能改进可以来自批量插入。

批量插入不是 ANSI SQL 功能,而是单个数据库提供程序的功能,MySQL 数据库连接器驱动程序提供了将批量插入重写为批量插入的配置

要启用它,请使用如下所示的连接字符串

jdbc.url=jdbc:mysql://localhost:3306/macula?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&rewriteBatchedStatements=true

现在,一旦完成此操作,如果您尝试运行该应用程序,并在 mysql 中启用常规查询日志记录,您将看到您的插入被重写为批量插入......但您也会得到一个BatchedTooManyRowsAffectedException:)

这是由org.hibernate.jdbc.Expectations.BasicExpectation.verifyOutcome() http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.6.ga/org/hibernate/jdbc/Expectations.java方法(第 67 行)

由于 hibernate 对重写一无所知,它无法理解更新计数,我找不到合理的方法来挂钩我的 Expectations 类的实现......

这是一种死胡同,我们不能在 hibernate 中使用 rewriteBatchedStatements 功能!

好吧,除非你愿意做一个邪恶的黑客,那就是......只需将类复制粘贴到完全相同的包层次结构下的项目代码中,这意味着 hibernate 将选择你复制粘贴的类,而不是打包在 hibernate jar 中的类,然后注释掉 if 语句...是的,那么一切都会顺利进行!

请仔细考虑上述黑客行为;)

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

Hibernate/JPA 中批量插入 CollectionTable 元素 的相关文章

随机推荐

  • ObjectMapper 无法正确处理 UTF-8?

    我正在使用 ObjectMapper 将系统中的帖子序列化为 json 这些帖子包含来自世界各地的条目并包含 utf 8 字符 问题是 ObjectMapper 似乎没有正确处理这些字符 例如 字符串 Mus e d Orsay 被序列化为
  • 使用 Connect 或将数据作为道具传递给孩子

    我是反应和还原的新手 我有一个场景 其中有这样的嵌套组件 A gt B gt C gt D A 组件中使用了一个属性 D 组件中也会使用该属性 所以 我有两种方法 从组件 A 中的 redux 存储获取状态 然后将其作为 props 传递给
  • 无法在 Mac 上访问 std 向量迭代器 _Ptr

    在 Visual Studio 上 这段代码就像一个魅力 auto child node childs begin while child node childs end vector
  • Matlab 样条插值 从 Y 中找到 X

    我需要找到当 y 0 时 x 的值 这是我的代码 x 2 3 4 5 6 y 10 8 4 1 2 xi linspace 2 6 100 yi interp1 x y xi spline plot x y o xi yi xlabel x
  • Rails:查找父对象的所有关联对象

    我在 Rails 中创建了一个复杂的对象 其主要父对象 Resume 它的每个部分都有多个子对象 objective section contact section 等 有没有一种方法可以将所有关联的对象获取到父对象恢复 如果 获取 是指在
  • RESTful API 密钥建议 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在寻找有关 RESTful API 设计的建议 我已经阅读了很多有关 REST API 方案 身份验证 授权方式等的内容 我无法决定的是我是
  • 如何最大化背景窗口?

    我需要最大化背景中的窗口 这意味着不激活 聚焦 它 SetWindowPlacement 函数不提供此功能 有任何想法吗 WINDOWPLACEMENT wp new WINDOWPLACEMENT GetWindowPlacement h
  • 程度报告问题并行测试

    我有以下报告代码 public class Reporting private ExtentHtmlReporter extentHtmlReporter private static ThreadLocal
  • 如何在 React Native 中获取组件在屏幕上的位置?

    我正在开发一个反应本机应用程序 我想处理屏幕上的触摸 一个用例是当用户在屏幕上 按下 时 我希望能够获取屏幕上特定组件的位置 x y 以了解它是否与触摸的 x y 匹配 我已经搜索过堆栈溢出 但给定的解决方案都不起作用 在我的根组件中 on
  • 分析 pyomo 中的解决方案 (.sol) 文件

    我在机器 1 中有一个 pyomo 模型 在机器 2 中有 CPLEX 求解器 我转换 pyomo 模型 ConcreteModel 变成problem lp带有函数的文件model write problem lp 在机器 1 中 然后我
  • jQuery 在两个类之间滚动切换

    默认情况下 我有一个具有红色背景颜色的导航栏 我想要做的是 当用户向下滚动超过 100px 将背景更改为蓝色 并且如果他返回到 0px 将背景更改为其默认状态 例如 我想通过在两个类之间切换来做到这一点 div class navigati
  • perl + 如何声明数组

    以下脚本 test pl 在 myfile txt 文件的 first line 1 和 second line 1 之间附加 insert 1 文本 并将输出发送到 output txt 但如果我将数组声明为 my first line
  • 尝试在flutter中创建不同语言的pdf

    我想在 PDF 中打印印地语 我也尝试过使用 Google 的 Raleway Regular ttf 字体 但也没有成功 final font await rootBundle load fonts ARIAL TTF final ttf
  • 我的 SQLite 语法错误

    SQLite 新手 所以我不知道我做错了什么 我刚刚收到一条错误消息 SQLSTATE HY000 General error 1 near CREATE syntax error 这是我的 SQL CREATE TABLE users i
  • 如何转置 MySQL 行和重复列标题?

    我有一个 mysql 表 如下所示 id group id item code item label item detail item score 1 10 BLU123 Blue 123 Blah blah 123 3 2 10 BLU1
  • 我可以让实时 PHP 数据显示在 jquery 对话框中吗?

    我正在尝试将两种想法结合起来 但我不确定它们是否相互兼容 想法一 让 php 脚本运行命令 例如 ping 并在 Web 浏览器中提供命令的实时结果 想法2 出现一个 jQuery 对话框 打开时运行 php 脚本并在对话框中提供实时结果
  • 如何从 Diego 上的 Cloud Foundry 提取文件

    我想检索一些应用程序的日志 我发现这个命令cf file不再可用 该插件cf download 不适用于迭戈建筑 https github com ibmjstart cf download issues 12 有没有办法通过 CLI 其他
  • 检查静态库的iOS部署目标

    我有很多静态库 比如libBlah a With file我可以检查支持的架构的工具 arm64 或 i386 有没有工具可以检查iOS Deployment Target静态库的 您可以使用otool检查库文件 通过一些实验我发现标志 l
  • 小米等智能手环官方SDK/API

    我们想要开发一个 Android 应用程序来支持 MiBand 和其他智能手环 我们希望通过 BLE 从智能手环获取心率等信息 并将其显示在移动应用程序中 我们如何从设备获取这些信息 有官方的SDK或者API吗 还有一个 huami tec
  • Hibernate/JPA 中批量插入 CollectionTable 元素

    我们使用 Hibernate 4 2 作为 JPA 2 0 实体的支持库 我们有一个如下所示的实体 Entity public class MyEntity ElementCollection MapKeyColumn name key C