Spring JpaRepository - 分离和附加实体

2024-01-11

我在 jpa 上使用 spring boot 和 hibernate 。我正在使用 JpaRepository 接口来实现我的存储库。与以下 UserRepository 一样

public interface UserRepository extends JpaRepository<User, Long> {
}

我想实现以下目标

  1. 加载用户实体。
  2. 更改实体对象的状态,例如user.setName("foo")
  3. 进行外部系统 Web 服务调用。将调用结果保存到DB中
  4. 仅当成功响应此 Web 服务调用时,才将用户的新状态保存在存储库中。

上述所有步骤都不会在一个事务中发生,即外部服务调用不在事务中。

当我通过其存储库将 Web 服务结果保存在数据库中时,我对用户实体的更改也会保存。根据我的理解,这是由于在第 3 步中刷新了底层持久性上下文。经过一番谷歌之后,我认为如果我可以在第 1 步中分离我的用户实体并在第 4 步中重新附加它,我认为我可以实现我的目的。 请确认我的理解是否正确以及如何实现这一目标? JpaRepository 接口中没有方法来分离实体。

下面用代码来说明

public void updateUser(int id, String name, int changeReqId){
    User mUser = userRepository.findOne(id); //1
    mUser.setName(name); //2

    ChangeRequest cr = changeRequestRepository.findOne(changeReqId);
    ChangeResponse rs = userWebService.updateDetails(mUser); //3

    if(rs.isAccepted()){
        userRepository.saveAndFlush(mUser); //4
    }

    cr.setResponseCode(rs.getCode());
    changeRequestRepository.saveAndFlush(cr); //this call also saves the changes at step 2
}

Thanks


如果您使用的是 JPA 2.0,则可以使用EntityManager#detach() http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#detach(java.lang.Object)从持久性上下文中分离单个实体。另外,Hibernate 还有一个会话#evict() http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#evict(java.lang.Object)其目的相同。

Since JpaRepository本身不提供此功能,您可以添加自定义实现 http://docs.spring.io/spring-data/data-jpa/docs/current/reference/html/#repositories.custom-implementations到它,像这样

public interface UserRepositoryCustom {
    ...
   void detachUser(User u);
    ...
}

public interface UserRepository extends JpaRepository<User, Long>, UserRepositoryCustom {
    ...
}

@Repository
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    ...
    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void detachUser(User u) {
        entityManager.detach(u);
    }
    ...
}

我还没有尝试过这段代码,但你应该能够让它工作。你甚至可能会尝试抓住EntityManager在您的服务类别中(其中updateUser()是)与@PersistenceContext,并避免将自定义实现添加到存储库的麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring JpaRepository - 分离和附加实体 的相关文章

随机推荐