我正在使用 Spring/Hibernate 完成 JPA 方式,org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
并使用 spring xml、persistence.xml 和 JPA 2 注释进行配置。
从功能上讲,它很好并且可以正确地持久化。但是,我需要尽快存储具有双向 OneToMany 和大量 B 集合的实体 A。
我正在使用 persistence.xml 中的各种选项来尝试加快插入速度并减少内存使用(应用程序的写入量与读取量差不多)
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.jdbc.batch_size" value="50" />
<property name="hibernate.order_inserts" value="true" />
<property name="hibernate.order_updates" value="true" />
<property name="hibernate.cache.use_query_cache" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="false" />
并坚持使用
entityManager.persist(instanceOfA)
编辑附加信息:
每个实体都有一个生成的 id,如下所示:
@Id
@Column(name="ID")
@GeneratedValue(strategy=GenerationType.AUTO, generator="SEQUENCE_GENERATOR")
@SequenceGenerator(name="SEQUENCE_GENERATOR", sequenceName="MY_SEQUENCE", allocationSize=50)
private Long id;
这与 Oracle 序列有关
CREATE SEQUENCE MY_SEQUENCE MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 50 NOCYCLE NOCACHE NOORDER;
当我使用 show sql 运行代码时,我可以看到很多插入语句需要很长时间。
我读过我需要entityManager.flush(); entityManager.clear();
每插入 50 行调用一次。
这是否意味着我需要将坚持分解为
entityManager.persist(instanceOfA);
instanceOfA.addB(instanceOfB);
entityManager.persist(instanceofB);
每 50 次调用添加一次刷新清除persist()
?
有更清洁的方法吗?(我的实际对象层次结构有大约 7 层关系,如 A 和 B)
我正在考虑使用 JDBC 进行插入,但我讨厌编写行映射器 :)
我听说过,org.hibernate.StatelessSession
但没有任何方法可以从 JPA 实体管理器中获取它,而无需在某些时候强制转换为 SessionFactory - 再次不是很干净。
提前致谢!