坚持新的JPA实体并分离

时间:2017-01-20 07:29:39

标签: hibernate jpa spring-data-jpa

用例是:

  • 创建许多新实体并将其保存在数据库中的单个事务中

我使用JPA / Hibernate找到的唯一有效的解决方案是执行以下步骤。原因是hibernate将实体保留在第一级缓存中,直到事务结束。

  • 创建新实体
  • 强行快速冲洗()
  • 分离实体

这样做的开销是

  • 您需要将entityManager / sessionFactory注入您的业务逻辑,并管理实体的刷新和分离
  • 每次插入后都需要强制进行低效的冲洗

真正的期望是JPA或者至少Hibernate会暴露某种功能,以便快速创建一个实体并坚持下去而不保持其管理。

其他解决方案:

  • 使用JDBC或JdbcTemplate,但您必须为实体编写自己的插入

所以问题是:是否有可能在同一时间坚持和分离,甚至更好地坚持而不被管理?

1 个答案:

答案 0 :(得分:1)

您可以使用没有第一级缓存的无状态会话。 来自文档:

 StatelessSession session = sessionFactory.openStatelessSession();
 Transaction tx = session.beginTransaction();
 ScrollableResults customers = session.getNamedQuery("GetCustomers")
        .scroll(ScrollMode.FORWARD_ONLY);
 while ( customers.next() ) {
     Customer customer = (Customer) customers.get(0);
     customer.updateStuff(...);
     session.update(customer);
 }     
 tx.commit();
 session.close();
  

在此代码示例中,查询返回的Customer实例是   立刻脱离了。它们永远不会与任何持久性相关联   上下文。

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html