一尘不染

Hibernate关系映射/加速批量插入

hibernate

我有5个MySQL
InnoDB表:Test,InputInvoice,InputLine,OutputInvoice,OutputLine每个表都在Hibernate中映射并起作用。我玩过使用StatelessSession
/ Session和JDBC批处理大小。我删除了任何生成器类,以使MySQL处理id生成-
但它的执行速度仍然很慢。这些表中的每一个都在java类中表示,并相应地在hibernate中进行映射。目前,当需要将数据写出时,我遍历对象并执行一个session.save(Object)session.insert(Object)如果正在使用StatelessSession)。当行数达到最大jdbc批处理大小(50)时,我还会进行刷新和清除(使用Session时)。

  1. 如果将这些放在一个“父”类中来保存对象,然后做一个session.save(master)而不是每个对象,会更快吗?
  2. 如果我将它们放在主/容器类中,我该如何将它们映射到hibernate状态以反映这种关系?容器类实际上不是它自己的表,而是一个全部基于两个索引run_id(int)和line(int)的关系。
  3. 另一个方向是:如何让Hibernate进行多行插入?

阅读 280

收藏
2020-06-20

共1个答案

一尘不染

对我来说,最终的解决方案是将voetsjoeba的回答作为出发点。我的hibernate配置使用以下选项:

hibernate.order_inserts = true
hibernate.order_updates = true
  • 我从Session改为 StatelessSession

  • 重新排序Java代码以一次处理一个表中的所有元素。因此,所有表x,然后是表y,依此类推。

  • <generator>从每个类中删除了。Java现在创建它并将其分配给对象

  • 创建的逻辑使我能够确定是否仅设置了一个ID,而不是将“空”行写入数据库

  • 最后,我在dynamic-insert 类的hibernate定义中打开了我的类,如下所示:<class name="com.my.class" table="MY_TABLE" dynamic-insert="true">

2020-06-20