【问题标题】:JpaRepository save flushes all entitiesJpaRepository 保存刷新所有实体
【发布时间】:2017-05-03 16:44:39
【问题描述】:

我在 spring data jpa 中使用 jpatransactionmanager 并且提供者是 Hibernate。

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactoryBean" />
</bean>

我有三个实体,分别是 Aentity、Bentity。 A 和 B 是一对一的关系。还有第三个实体Centity。 Centity 的持久性独立于 Aentity 和 Bentity。但是,我发现每当保存 Centity 时,Aentity 和 Bentity 都会自动刷新到 db。我想控制这种行为,并希望确保当我使用他们的存储库调用 save 时它们应该被持久化。

其他信息: Aentity 为 B 提供了案例。 Centity 的交易信息是:传播:需要新的和隔离=默认

我查看了许多论坛,但找不到提示/解决方案。

【问题讨论】:

标签: hibernate spring-data-jpa spring-transactions


【解决方案1】:

可能是启用了自动提交,因此一旦您调用 save 方法,实体就会刷新到数据库。 试试这个。

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />

【讨论】:

  • 尚未调用 save 的实体也会被保存。这就是问题所在。我相信 jpatransactionmanager 在持久性上下文中工作,是否有任何属性可以调整这方面。在这种情况下使用 HibernateTransactionManager 将无济于事
【解决方案2】:

如果您对不想存储在数据库中的相关对象进行了一些修改,您应该像这样将它们从 entityManager 中分离出来:

    static void applyToEntity(User user, EntityManager entityManager) {

        entityManager.detach(user); //Detach object because temp settings can be    accidentally stored
        entityManager.detach(user.client) //Detach object because of temp settings can be accidentally stored

        user.client.showActivityContacts = true;
        user.allowRoles = true;
 }

这将导致这些对象不会被级联保存,因为它们将不再被管理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2021-02-20
    • 1970-01-01
    • 2020-11-07
    • 2017-09-11
    相关资源
    最近更新 更多