Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么实体在没有显式调用save方法的情况下更改其状态?_Java_Spring_Hibernate_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java 为什么实体在没有显式调用save方法的情况下更改其状态?

Java 为什么实体在没有显式调用save方法的情况下更改其状态?,java,spring,hibernate,spring-boot,spring-data-jpa,Java,Spring,Hibernate,Spring Boot,Spring Data Jpa,我有以下一段伪代码: Bid update(Bid toUpdate) { final Bid existing = repository.findOne(toUpdated.id); // 2 if(existing.hasTerminalStatus()) { throw new WhateverException("Editing terminated bid is not possible!"); } // ... closeCorrespondingB

我有以下一段伪代码:

Bid update(Bid toUpdate) {
  final Bid existing = repository.findOne(toUpdated.id); // 2

  if(existing.hasTerminalStatus()) {
    throw new WhateverException("Editing terminated bid is not possible!");
  }

  // ...

  closeCorrespondingBids(existing.saleOffer.id);

}

void closeCorrespondingBids(Long saleOfferId) {
  final List<Bid> bids = repository.findBySaleOfferId(saleOfferId);
  bids.forEach(bid -> {
    bid.status = CLOSED;
    update(bid); // 1
  });
}
标书更新(标书更新){
最终出价存在=repository.findOne(toUpdated.id);//2
if(existing.hasTerminalStatus()){
抛出新的WhateverException(“不可能编辑终止的出价!”);
}
// ...
关闭相应的投标(现有的.saleOffer.id);
}
撤销相应的投标(长期出售){
最终列表出价=repository.findBySaleOfferId(saleOfferId);
出价。forEach(出价->{
bid.status=已关闭;
更新(投标);//1
});
}
当代码从标有
//1
的行返回到
//2
中的
更新
方法时,即使未执行对
保存
的调用,也未显式定义任何事务,状态已更改。为什么呢

在SpringBootV项目中<代码>1.5.6.版本与hibernate一起使用
5.2.11.最终版


脏检查是否是所述行为的原因?

是。在事务中,
onFlush
会话中的所有实体都会被脏检查,如果实体脏,则执行
UPDATE
语句。@msparer,谢谢!我没有在这里定义显式事务。是否设置了默认值?我假设您使用的是spring数据,那么是:“spring数据JPA存储库实现的CRUD方法已经用@Transactional”(from)@msparer进行了注释,是的,确实
spring数据
在项目中使用。谢谢你的链接!这里的解决方案是什么?实际上,
final Bid existing=repository.findOne(toUpdated.id);//2
除了从会话中获取相同的对象(
==
)之外,什么都不做,因此您也可以不调用它,直接对对象执行操作