我的班级结构如下:
class A{
int id;
List<B> blist;
List<C> clist;
List<D> dlist;
}我得到一个json作为一个输入,它由一个映射程序映射到object A。现在,我有一个对象A,它包含B、C和D对象的列表。我想使用批处理来节省插入时间。如果我想保存多个父对象,那么我浏览了文档,它描述了解决方案。在有多个类型的对象嵌套列表的情况下,如何使用批处理功能。
我已启用批处理插入
<property name="hibernate.jdbc.batch_size">50</property>这本身并没有给我任何批次,除非我清理和冲洗会议。对我该怎么做有什么建议吗?
发布于 2017-03-01 01:49:17
问题在于您使用的是IDENTITY策略。
每当您保存一个新实体时,Hibernate都会将其放入会话的1LC中;但是,为了做到这一点,必须知道标识符。IDENTITY策略的问题是Hibernate必须实际执行插入来确定标识符值。
最后,禁用批处理插入功能。
您应该尝试使用预先知道的业务键值加载数据,或者更糟糕的情况是,使用SEQUENCE生成类型和序列优化器来最小化对数据库的影响。这将允许批量插入工作。
更新
对于没有定义行唯一性的业务密钥且数据库不支持SEQUENCE的情况,您可以自己管理标识符。您可以选择使用自定义标识符生成器执行此操作,也可以选择在循环中作为代码执行此操作。
这里的警告是,这个解决方案是而不是线程安全的。您应该保证在任何时候您都不会在两个线程中同时运行这个逻辑,这通常不是在大容量数据加载时所做的事情。
@Id注释的字段。不应该将其标记为@GeneratedValue,因为我们将允许应用程序提供该值。#setId( value )方法即可。value变量增加1。https://stackoverflow.com/questions/42514406
复制相似问题