首页 > 编程知识 正文

predicate java,springdata和jpa

时间:2023-05-05 04:25:24 阅读:137438 作者:581

使用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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。