8

私は Hibernate と Spring がまったく初めてで、Spring、Hibernate、Maven などを学ぼうとして、3 つすべてを使用して hello world の例を実行する方法しか知りません。私の基本的な理解により、楽観的ロックを実行するタスクが割り当てられました。私がグーグルで調べた限り、私が必要とするのは、xmlにバージョンタグを追加し、マップされたクラスに整数変数バージョンを追加するだけで、それほど難しくないことがわかります..このように...

public class MyClass {
...
private int version;
...
}

私のxmlは次のようになります

<class name="MyClass">
<id ...>
<version name="version" column="VERSION" access="field">
...
</class>

また、2 番目のユーザーが保存すると、hibernate は自動的にバージョン管理を行います。hibernate は、このユーザーが古いデータで作業していることを検出し、StaleObjectException をスローします。

私の理解を確認したかっただけです。事前に感謝します。

これについて、誰かが Hello World の例を教えてくれると本当に助かります。

また、「最後のコミットが勝つ」シナリオを実装しようとしていることにも言及したいと思います

4

2 に答える 2

12

私は Hibernate アノテーションを使用しました。これが楽観的ロックの実装です

@Entity
public class MyObject {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String data;

    @Version
    private Integer version; // this is version field
}

これが実際の例です

// Entity class with version field
@Entity
public class Ent1 implements Serializable {

    private static final long serialVersionUID = -5580880562659281420L;

    @Id
    Integer a1;

    Integer a2;

    @Version
    private Integer version;
}

そして、DBに1つの要素を追加するためのいくつかのコード

        session = HibernateHelper.getSessionFactory().openSession();
        transaction = session.beginTransaction();
        Ent1 entity = new Ent1();
        entity.setA1(new Integer(0));
        entity.setA2(new Integer(1));
        session.save(entity);
        transaction.commit();

        // get saved object and modify it
        transaction = session.beginTransaction();
        List<Ent1> list = (List<Ent1>)session.createQuery("FROM Ent1 WHERE a1 = 0").list();
        Ent1 ent = list.get(0);
        ent.setA2(new Integer(1000));
        session.save(ent);
        transaction.commit();

作成後、DB の新しい要素のバージョンは 0 です。変更後はバージョン 1 です。

HibernateHelper.java

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateHelper {

    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
于 2011-08-02T11:05:39.673 に答える