1

アプリケーションは、そのエンティティ クラスでバージョン属性を定義することにより、楽観的ロックを使用します。アプリケーションは、JPQL クエリを使用してエンティティの一括更新を実行します。この場合、正しいステートメントは次のうちどれですか?

A. 持続性プロバイダは、各テーブルのバージョン値が更新されることを保証します。

B.更新された資格のバージョン属性の値も、クエリによって明示的に更新する必要があります。

JPA仕様による

「一括更新はデータベース更新操作に直接マップされ、楽観的ロック チェックをバイパスします。ポータブル アプリケーションは、必要に応じてバージョン列の値を手動で更新するか、バージョン列の値を手動で検証する必要があります。」

したがって、私の理解では、オプション B が正解です。しかし、私の同僚の何人かは別の言い方をしています。正しい振る舞いを教えてください。

4

1 に答える 1

1

You are right, what it comes to specification A is definitely wrong answer.

Specific implementations of specification are still aloud to update value of @Version when JPQL bulk update is done. How certain implementation behaves is hopefully documented. When not, following can be used to check does bulk update affect version:

@Entity
public class SomeEntity {
    @Id private int id;
    private String someValue;
    @Version private int version;
    //getters, setters
}

    //creating entity
    tx.begin();
    SomeEntity se = new SomeEntity();
    se.setId(1);
    em.persist(se);
    tx.commit();

    String versionJpql = "SELECT se.version FROM SomeEntity se WHERE se.id = 1";
    //original version
    Integer version = em.createQuery(versionJpql,Integer.class).getSingleResult();

    //bulk update
    tx.begin();
    em.createQuery(
            "UPDATE SomeEntity se SET se.someValue='some' WHERE se.id = 1"
    ).executeUpdate();
    tx.commit();

    Integer versionAfterUpdate = em.createQuery(versionJpql, Integer.class)
            .getSingleResult();

    //has version been changed:
    assertEquals(version, versionAfterUpdate);
于 2013-09-10T17:55:39.050 に答える