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