列出需要保存的数据。保存前必须删除现有数据并保存新数据。如果有任何删除
public LabResResponse saveLabResult(List<LabResInvstResultDto> invstResults) {
LabResResponse labResResponse = new LabResResponse();
List<Long> relInvstid = new ArrayList<Long>();
try{
if(invstResults != null){
List<LabResInvstResult> labResInvstResults = mapper.mapAsList(invstResults, LabResInvstResult.class);
for(LabResInvstResult dto: labResInvstResults){
if(dto != null){
//delete all child records before save.
deleteResult(dto, relInvstid);
}
}
}
labResResponse.setRelInvstids(relInvstid);
}catch(Exception e){
e.printStackTrace();
}
return labResResponse;
}
在这里,每次删除都会添加新事务
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { Exception.class })
private void deleteResult(LabResInvstResult dto, List<Long> relInvstid) {
try{
labResultRepo.deleteById(dto.getId());
LabResInvstResult result = labResultRepo.save(dto);
}catch(Exception e){
e.printStackTrace();
}
}
在删除时,它会引发异常“由以下原因引起:javax.persistence.TransactionRequiredException:没有具有实际事务的实体管理器可用于当前线程 - 无法可靠地处理'remove'调用”
我可以通过添加一个@ Transactional for public labresponse savelab result(List invstResults)方法来解决这个问题。但是我最初用例不起作用,这将回滚整个事务列表。
您正在从 for 循环中捕获异常,而您的要求说您希望继续列表中其他对象的循环。将尝试/捕获块与 in 循环。它应该工作正常
public LabResResponse saveLabResult(List<LabResInvstResultDto> invstResults) {
LabResResponse labResResponse = new LabResResponse();
List<Long> relInvstid = new ArrayList<Long>();
try{
if(invstResults != null){
List<LabResInvstResult> labResInvstResults = mapper.mapAsList(invstResults, LabResInvstResult.class);
for(LabResInvstResult dto: labResInvstResults){
if(dto != null){
//delete all child records before save.
try {
deleteResult(dto, relInvstid);
} catch(Exception e){
e.printStackTrace();
}
}
}
}
labResResponse.setRelInvstids(relInvstid);
}catch(Exception e){
e.printStackTrace();
}
return labResResponse;
}
这里有两个问题。
第一个问题是您调用类的“real”deleteResult
方法。当Spring看到@Transactional
时,它会创建一个具有事务行为的代理对象。除非您使用的是AsheJ,否则它不会更改类本身,而是创建一个新的代理。因此,当您自动配置此bean时,您将能够使用运行与事务相关逻辑的代理方法。但在您的情况下,您引用的是类的方法,而不是代理。
第二个问题是Spring(同样如果不使用AsheJ)不能代理非公共方法。
摘要:以某种方式使< code>deleteResult方法成为公共方法,并使用代理方法。建议使用另一个带有< code>deleteResult的组件。
尝试使用EntityManager时出错 我使用Spring(不是boot)、jpa和hibernate 有人能帮我吗? 实体课程 Spring配置类 在我得到的地方测试“刀” 使用find complete for error命令行 和我的主班 哦,我的朋友。xml 我在类和方法上使用了@Transactional,结果没有改变 请帮帮我,我已经做了所有的选择。
问题内容: 当尝试调用“ persist”方法将实体模型保存到Spring MVC Web应用程序中的数据库时,出现此错误。在Internet上找不到与该特定错误相关的任何帖子或页面。似乎似乎EntityManagerFactory bean出了点问题,但是我对Spring编程还是比较陌生,所以对我来说,似乎一切都已初始化好,并且根据Web上的各种教程文章。 dispatcher-servlet.
此错误发生在,当方法运行时。 向添加注释不能解决问题-https://stackoverflow.com/a/32552558/3536552 你知道怎么修吗?
我想发出POST请求以将用户保存到我的Oracle DB中。 我在jpa和hibernate中使用Spring MVC。 这是我的jpaContext.xml 这是我的UserRepoImpl类: 这是UserServiceImpl类: 这是来自REST控制器的方法: 我在服务图层上有注释。我尝试了许多在线找到的解决方案,使用存储库层上的@Transactional,或者使用@Scope(prox
在SpringMVCWeb应用程序中,试图调用“persist”方法将实体模型保存到数据库时,我遇到了这个错误。在internet上找不到任何与此特定错误相关的帖子或页面。看起来EntityManagerFactoryBean有点问题,但我对Spring编程相当陌生,所以对我来说,根据web上的各种教程文章,似乎一切都初始化得很好。 调度器servlet。xml 注册控制器。JAVA
问题内容: 项目使用Hibernate(JPA),Spring和Maven。我的实体和DAO在单独的JAR中。 pom.xml: 道: } 我有一个使用Spring的模块。 pom.xml: AppContext.xml: 服务: 当我尝试从EntityManager中获取会话时,遇到以下异常: 问题答案: 您必须在方法周围加上@Transactional批注: 并在您的Spring的xml配置文