如果db状态已更改,则刷新实体

时间:2017-04-10 11:42:57

标签: java spring spring-boot spring-data-jpa spring-transactions

我有一个Springboot应用程序和一个带有大量PL / SQL过程的Oracle数据库,它们一直在改变数据库的状态。 所以现在我想更改一个想要保存它的加载实体。如果entitymanager的entitystate和db的状态相等,一切正常。但在某些情况下,他们并不平等。因此,如果我加载一个实体并进行一些更改,那么PL / SQL过程会更改数据库表。如果我保存实体,我当然会得到一个Execption。所以我试图捕获Exception,然后在catch块中我想在保存之前刷新Entity。但我仍然得到一个例外。交易不是喷气机完成的吗?我该如何处理这个问题? 我希望示例代码解释一下。

    @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);
  }

}

我希望,任何人都可以帮助我。

由于

1 个答案:

答案 0 :(得分:0)

是的问题是..当你调用加载所有方法时,这是一种事务方法,当你从那个方法返回时,实体从session / entitymanager中分离出来。所以,接下来你试图保持分离的对象。这就是你得到例外的原因。 所以你可以使用session.update()或session.merge()将新更新保存到数据库中。