我有一个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);
}
}
我希望,任何人都可以帮助我。
由于
答案 0 :(得分:0)
是的问题是..当你调用加载所有方法时,这是一种事务方法,当你从那个方法返回时,实体从session / entitymanager中分离出来。所以,接下来你试图保持分离的对象。这就是你得到例外的原因。 所以你可以使用session.update()或session.merge()将新更新保存到数据库中。