1

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つの選択が不必要に複製されます!!!

4

1 に答える 1

1

RequestFactory は差分のみを送信するため (つまり、クライアント側でオブジェクトに変更を加えたもの)、サービス メソッドを呼び出す前にサーバー側のオブジェクトにそれらの差分を適用する必要があります。そのため、オブジェクトを見つける必要があります。その ID によって。
また、オブジェクトを変更せずに参照する場合 (たとえば、プロパティ オブジェクト A をオブジェクト B を参照するように設定すると、オブジェクト B は変更されません)、同じ find() メソッドが使用されます。この場合、おそらく楽観的ロック エラーが発生することは望ましくありません (つまり、楽観的ロック チェックを find() に組み込むことはできません)。
競合を処理する必要があるため、楽観的ロックをうまく行うのは困難です (そして、ユーザーは「あなたが変更している間に誰かが変更したので、私は」と読みたくないでしょう)。

楽観的ロックと RequestFactory についてはhttp://code.google.com/p/google-web-toolkit/issues/detail?id=6046をご覧ください。

于 2011-09-22T09:58:48.057 に答える