Java 如果数据库状态已更改,则Spring刷新实体

Java 如果数据库状态已更改,则Spring刷新实体,java,spring,spring-boot,spring-data-jpa,spring-transactions,Java,Spring,Spring Boot,Spring Data Jpa,Spring Transactions,我有一个Springboot应用程序和一个oracledb,其中包含许多PL/SQL过程,这些过程会一直改变数据库的状态。 所以现在我想更改一个加载的实体并保存它。如果entitymanager的entitystate和db的状态相等,则一切正常。但在某些情况下,它们并不平等。因此,如果我加载一个实体并对其进行一些更改,则PL/SQL过程会更改DB表。如果我保存实体,我当然会得到一个Execption。因此,我尝试捕获异常,然后在catch块中,我希望在保存实体之前刷新实体。但我还是有个例外。交

我有一个Springboot应用程序和一个oracledb,其中包含许多PL/SQL过程,这些过程会一直改变数据库的状态。 所以现在我想更改一个加载的实体并保存它。如果entitymanager的entitystate和db的状态相等,则一切正常。但在某些情况下,它们并不平等。因此,如果我加载一个实体并对其进行一些更改,则PL/SQL过程会更改DB表。如果我保存实体,我当然会得到一个Execption。因此,我尝试捕获异常,然后在catch块中,我希望在保存实体之前刷新实体。但我还是有个例外。交易是否尚未完成?我如何处理这个问题? 我希望示例代码能解释一下

    @RestController
    @RequestMapping("/*")
    public class FacadeController {

     ...

     @ResponseStatus(HttpStatus.OK)
     @RequestMapping( value= "/test4" , method=RequestMethod.GET)
     public String test4(){

        Unit unit = unitSvice.loadUnit(346497519L);   

        List<UnitEntry> entries = unit.getEntries();      

        for (UnitEntry g : entries) {
          if (g.getUnitEntryId == 993610345L) {
            g.setTag("AA");
            g.setVersion(g.getVersion() + 1);
            g.setstatus("SaveOrUpdate");
          }
        }    

        //<-- DB Table changed entity managed by entitymanger and DB Table 
        //    are no langer equal. 

        try {      
         unitSvice.updateUnit(unit , false);
        }catch(DataAccessException | IllegalArgumentException e) {
         unitSvice.updateUnit(unit , true);
        }

       ...

     }
   }


@Service("unitSvice")
public class UnitSvice {

  @Autowired
  private UnitDao repoUnit;

  @Transactional
  public Unit loadUnit(Long _id) {
    Unit unit = repoUnit.findOne(_id);   
    return unit;
  }

  @Transactional
  public void updateUnit(Unit unit, boolean _withrefrsh )  {
   if(_withrefrsh) {
     getEntityManager().refresh(unit.getId());
   }
    repoUnit.save(unit);
  }

}
@RestController
@请求映射(“/*”)
公共类FacadeController{
...
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value=“/test4”,method=RequestMethod.GET)
公共字符串test4(){
单位=单位冰荷载单位(346497519L);
列表条目=unit.getEntries();
对于(单位分录g:分录){
如果(g.getUnitEntryId==993610345L){
g、 setTag(“AA”);
g、 setVersion(g.getVersion()+1);
g、 设置状态(“保存或更新”);
}
}    

// 是的,问题是..当您调用load all方法时,这是一种事务性方法,当您从该方法返回时,实体从session/entitymanager分离..因此,接下来您将尝试持久化分离的对象。这就是为什么会出现异常。
因此,您可能可以使用session.update()或session.merge()将新的更新保存到数据库中。

您是否可以跟踪您的错误类型。感谢您的响应。session.update()和entityManager的刷新都不起作用。但是entityManager.find(Unit.class,id)工作正常。find方法返回更新的db实体。因此我合并并保存它们。这似乎可行,但如果这是一个好的做法,我不是舒尔。