使用spring boot在jpa上休眠。 正在使用JPA资料档案库接口实现资料档案库。 与以下用户资料档案库相同
publicinterfaceuserrepositoryextendsjparepository {
}
我想达成以下目标
加载用户实体。
更改实体对象的状态,例如user.setname(「foo”中的)。
对外部系统执行Web服务调用,并将调用结果保存在DB中
仅当成功响应此Web服务调用时,将新用户状态保存到数据库中。
所有这些步骤都不会在一个事务中发生。 这意味着外部服务调用不在事务中。
将Web服务的结果从存储库保存到数据库时,也会保存用户实体的更改。 据了解,这是因为在步骤#3中更新了永久上下文。 我想在几个谷歌之后,如果第一步能分离用户实体,在第四步重新连接,就能达到我的目的。
请确认我的理解是否正确,以及实现这个目标的方法。 JPA资料档案库接口没有隔离实体的方法。
以下用代码说明
公共void更新用户(intid,String name,int changeReqId ) {
user muser=用户资料档案库. find one (id; //1
muser.setname(name; //2
更改请求Cr=更改请求存储库. find one (changere qid;
changere sponsers=userweb service.update details; //3
if(RS.isaccepted () ) ) ) )。
user repository.saveandflush (muser; //4
}
Cr.setresponsecode(RS.getcode ) );
更改请求存储库. saveandflush (Cr; //thiscallalsosavesthechangesatstep 2
}
谢谢
解决方法:
如果使用的是JPA 2.0,则可以使用EntityManager#detach ()将各个实体与持久性上下文分离。 Hibernate还具有会话# evict ),具有相同的目的。
由于JPA资料档案库本身不提供此功能,因此可以按如下方式使用add a custom implementation
publicinterfaceuserrepositorycustom {
.
voiddetachuser(useru;
.
}
publicinterfaceuserrepositoryextendsjparepository,UserRepositoryCustom {
.
}
@资料档案库
publicclassuserrepositorycustomimplementsuserrepositorycustom {
.
@ persistence上下文
权限管理器;
@Override
Publicvoiddetachuser(useru ) {
entitymanager.detach(u;
}
.
}
虽然没有尝试过这个代码,但是应该可以执行。 您也可以使用@PersistenceContext将EntityManager保留在作为updateUser (或)的服务类中,以避免将自定义实现添加到资源库中的喧嚣。
标签: java、spring、spring-data-jpa、jpa、hibernate
资料来源: https://codeday.me/bug/2019 09 25/1817836.html