3

私は自分のシステムに関するある日の統計を収集します。たとえば、私のシステムを使用している人の数と、その日に費やした合計時間です。私の統計エンティティは次のようになります。

class Stats {
    Date date;
    Long numUsers; 
    Long totalTime;        
}

日中、以前の値に基づいてこれらの統計を更新する必要があります。例:

stats.numUsers += 1;
stats.totalTime += timeSpentByLastUser;

もちろん、今日が初めての場合は、これらのデータを初期化する必要があります。

stats.numUsers = 1;
stats.totalTime = timSpentByFirstUserForToday; 

今、すべてをデータベースに移動したいと思います。つまりStats、エンティティを作成し、以前の値に基づいてアトミックな挿入/更新を行います。では、これを行うにはどうすればよいですか?私はJPAを使用しているため、そのモデルに適合するソリューションが適しています。

JPAには挿入または更新のメカニズムEntityManager.merge()がありますが、エンティティの以前の状態は考慮されていないことに注意してください。これはここで重要です。

4

1 に答える 1

3

はい、永続性に使用されるトランザクション ロック メカニズムを強制することにより、原子性を維持します。

Employee employee = entityManager.find(Employee.class, id);
employee.getAddress().setCity("Ottawa");
entityManager.lock(employee, LockModeType.WRITE);

JPA 2.0 で使用可能なロック モードを提供する以下のリンクを参照してください。

JPA 2.0 ロック

于 2013-03-05T14:45:38.923 に答える