3

私はエンティティを持っています:

<class name="name.dargiri.model.Entity" table="ENTITY" optimistic-lock="version">
  <version name="version" column="ver" type="long" />
</class

エンティティが何回保存されても、トランザクションの最後にHibernate はオブジェクトのバージョンを選択します。なんで?Hibernate は、オブジェクトを保存するときにこのバージョンを生成するため、それを認識しています。このメソッドがこれを呼び出すことがわかりました:

EntityVerifyVersionProcess#getCurrentVersion()

Hibernate はこれをログに生成します。

Hibernate: 
    /* update
        name.dargiri.model.Entity */ update
            ENTITY 
        set
            ver=?,
            USERNAME=?,
            lucky_number=? 
        where
            id=? 
            and ver=?
Hibernate: 
    /* get version name.dargiri.model.Entity */ select
        ver 
    from
        ENTITY 
    where
        id =?

MySQL と Session#save() を使用しています。

4

2 に答える 2

0

さて、私が書いていない問題と思われる問題は、LockMode.OPTIMISTIC の使用です。 session.get(Entity.class, 1L, LockMode.OPTIMISTIC);

これがこのロック モードの仕組みのようです。トランザクションの最後に、これまでオブジェクトのバージョンが変更されていないかどうかがチェックされます。そして、これはフラッシュ中には発生しません.Hibernateはとにかくチェックを行いますが、トランザクションの終わりまでに発生します.これは、データの上書きにもっと注意を払うための追加オプションだと思います.

于 2012-04-23T16:43:44.383 に答える
0

バージョン番号はデータベースによって管理されているため、Hibernate は追加の SQL ステートメントを実行して、更新が行われた後にバージョン番号を取得します。詳細については、これを非常によく説明しているこの記事をご覧になることをお勧めします。

于 2012-04-23T08:16:32.830 に答える