首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate批保存嵌套对象

Hibernate批保存嵌套对象
EN

Stack Overflow用户
提问于 2017-02-28 16:50:44
回答 1查看 1.8K关注 0票数 0

我的班级结构如下:

代码语言:javascript
复制
class A{
    int id;
    List<B> blist;
    List<C> clist;
    List<D> dlist;
}

我得到一个json作为一个输入,它由一个映射程序映射到object A。现在,我有一个对象A,它包含B、C和D对象的列表。我想使用批处理来节省插入时间。如果我想保存多个父对象,那么我浏览了文档,它描述了解决方案。在有多个类型的对象嵌套列表的情况下,如何使用批处理功能。

我已启用批处理插入

代码语言:javascript
复制
<property name="hibernate.jdbc.batch_size">50</property>

这本身并没有给我任何批次,除非我清理和冲洗会议。对我该怎么做有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-01 01:49:17

问题在于您使用的是IDENTITY策略。

每当您保存一个新实体时,Hibernate都会将其放入会话的1LC中;但是,为了做到这一点,必须知道标识符。IDENTITY策略的问题是Hibernate必须实际执行插入来确定标识符值。

最后,禁用批处理插入功能。

您应该尝试使用预先知道的业务键值加载数据,或者更糟糕的情况是,使用SEQUENCE生成类型和序列优化器来最小化对数据库的影响。这将允许批量插入工作。

更新

对于没有定义行唯一性的业务密钥且数据库不支持SEQUENCE的情况,您可以自己管理标识符。您可以选择使用自定义标识符生成器执行此操作,也可以选择在循环中作为代码执行此操作。

这里的警告是,这个解决方案是而不是线程安全的。您应该保证在任何时候您都不会在两个线程中同时运行这个逻辑,这通常不是在大容量数据加载时所做的事情。

  1. 定义要存储标识符的变量。我们需要根据数据库中标识符的现有最大值初始化这个变量。如果数据库中不存在任何行,我们可能希望将其初始化为1。 长值=. // createQuery (“从YourEntity中选择最大值(Id)”)值=(值== null ? 1L:==+ 1);
  2. 下一步是更改带@Id注释的字段。不应该将其标记为@GeneratedValue,因为我们将允许应用程序提供该值。
  3. 对于要插入的每一行,只需使用从步骤1生成的值变量调用#setId( value )方法即可。
  4. value变量增加1。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42514406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档