RequestFactory を使用してビューにデータを取得し、他のトランザクションで他の誰かがこのオブジェクトをバージョン 1 に更新します (私のビューにはまだバージョン 0 があります)。次に、いくつかの値を更新し、RequestFactory による変更を DAO レイヤーにプッシュします。問題は、変更されたオブジェクトがサービス層に転送されるときです。ロケーターは find メソッドを呼び出し、オブジェクトの最新バージョン (他の誰かによって変更されたもの) を取得します。したがって、DAO レイヤー オブジェクトのメソッドを更新すると、バージョン 1 とマージされ、両方のトランザクションから変更されます。この状況では、通常、Hibernate は例外をスローする必要があります。これは、オブジェクトが他のバージョン値 (楽観的ロック) を持つ必要があるためですか?
ロケータ:
@Component
public class TaskItemLocator extends Locator<TaskItem, Long> {
@Autowired
private TaskItemDao taskItemDao;
@Override
public TaskItem find(Class<? extends TaskItem> aClass, Long id) {
return taskItemDao.findTaskItem(id);
}
}
ダオ:
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void updateTaskItems(List<TaskItem> taskItemToUpdate) {
for (TaskItem ti : taskItemToUpdate) {
getHibernateTemplate().update(ti);
}
}
RequestFactory で find を呼び出さずにこの状況をシミュレートすると、すべて正常に動作します。他のトランザクションがオブジェクトを変更すると、例外がスローされます。しかし、RequestFactory でこの動作を取得するにはどうすればよいでしょうか? また、毎回更新する前に RequestFactory を呼び出して find メソッドを呼び出すので、DB への選択が実行されます。次にDAOレイヤーに移動し、オブジェクトのバージョンをチェックするため、hibernateはまったく同じ選択クエリを呼び出します。したがって、更新されたオブジェクトごとに、1つの選択が不必要に複製されます!!!