我有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时)。
Test,InputInvoice,InputLine,OutputInvoice,OutputLine
session.save(Object)
session.insert(Object)
session.save(master)
对我来说,最终的解决方案是将voetsjoeba的回答作为出发点。我的hibernate配置使用以下选项:
hibernate.order_inserts = true hibernate.order_updates = true
我从Session改为 StatelessSession
Session
StatelessSession
重新排序Java代码以一次处理一个表中的所有元素。因此,所有表x,然后是表y,依此类推。
<generator>从每个类中删除了。Java现在创建它并将其分配给对象
<generator>
创建的逻辑使我能够确定是否仅设置了一个ID,而不是将“空”行写入数据库
最后,我在dynamic-insert 类的hibernate定义中打开了我的类,如下所示:<class name="com.my.class" table="MY_TABLE" dynamic-insert="true">
dynamic-insert
<class name="com.my.class" table="MY_TABLE" dynamic-insert="true">