【发布时间】:2017-08-30 19:40:19
【问题描述】:
我的 Web 应用程序使用 Spring (4.2.9)、Spring Data (3.2.5)、JPA、Hibernate (4.3.8) 和 MS SQL Server (2014)。这是控制器方法中的流程:
ObjectA = service.getObjectAById(some_id);
o.setUpdate(new Date()); //for temporary need.
service.createObjectBAndSaveIt(new ObjectB());
这里有两个在服务层相关的方法:
@Override
@Transactional(readOnly = true)
public ObjectA getObjectAById(Long id) {
//load ObjectA from database
}
@Override
public void createObjectBAndSaveIt(Long id) {
//create and save ObjectB
}
请注意,ObjectA 和 ObjectB 没有直接或间接的关系。 ObjectA 有一个版本字段如下:
@Version
private Long version = 1L;
请注意,当执行上述 Web 流程时,ObjectA 的版本号会增加 1,即使 service.createObjectBAndSaveIt 中没有引用或使用它。据我所知,Hibernate 在执行service.createObjectBAndSaveIt 时会进行脏检查并保存 OjbectA。我不想要这种默认行为。如何使系统仅保留出现在事务处理方法中的对象(例如 ObjectB)?任何指针或示例将不胜感激。
【问题讨论】:
-
如果您更新/创建对象 B 使用来自对象 A 的数据,则此行为正是您所需要的,否则您可能会读取 skew。
-
@GionJh,感谢您的参与!如代码所示,创建和保存 ObjectB 完全独立于 ObjectA。 “读取偏差”是什么意思?
-
这是并发事务写入和读取相同数据的副作用,您可以通过乐观锁定来避免它。谷歌它。
-
如果他们是独立的你不需要它..我只能说弹簧数据是这里的玩家..但不深入了解它我无法进一步帮助你
-
GionJh,感谢您的参与。问候。
标签: hibernate spring-mvc jpa