1

最近 からOpenJPAに変換されたプロジェクトがありHibernateます。に固有の構成の部分を置き換える際に、 でOpenJPA複製できない 1 つの機能に出くわしましたHibernate

ではOpenJPA、エンティティに で注釈を付け@Strategy、 のインスタンスを提供することにより、カスタム削除を実行していましたorg.apache.openjpa.jdbc.meta.strats.AbstractStrategy。このcustomDeleteメソッドでは、単一の共有ストアド プロシージャを呼び出し、テーブル名、エンティティ ID、およびアクションを実行するユーザー ID を渡しました。このプロシージャは、エンティティを削除し、監査ログ エントリを作成します。

ではHibernate、使用可能なフックがいくつか見つかりますが、同じ機能を提供するものはないようです。私は以下を見てきました:

  1. @SQLDelete("customer delete query") - このオプションは、テーブル名やユーザー ID ではなく ID へのアクセスのみを許可するため、クラスごとにカスタマイズされ、まだ情報が不足しています

  2. EntityListener クラス - このオプションは、エンティティが削除されたことを示しますが、実際に関与していたテーブルを取得するために掘り下げる必要があり、単一の db 操作の範囲外です

EntityListerOpenJPA メソッドにより近い他のオプションはありますか?それとも、テーブル名を決定するために、クラスを使用して独自の重い作業を行うのが最善の策ですか?

4

1 に答える 1

0

カスタムDBメソッドを定義できる永続性クラスのDAOオブジェクトはどうですか。HiberObjects で生成された DAO の例を次に示します。生成されたメソッドは、@ generated コメントを削除することで、必要に応じて定義できます。

package de.cw.minifigfinder.dao;

import javax.persistence.EntityTransaction;

import de.cw.minifigfinder.model.UIValues;

/**
 * @generated
 */
public class UIValuesDAO {

private static final String ID = "MINIFIGFINDER";

/**
 * @generated
 */
public UIValuesDAO() {
}

/**
 * @generated
 */
private javax.persistence.EntityManager getSession() {
    return de.cw.minifigfinder.util.HibernateHelper.getInstance()
            .getEntityManager();
}

public Long create() {
    UIValues object = new UIValues();
    object.setValuesID(ID);
    if (object == null)
        throw new IllegalArgumentException("object");
    javax.persistence.EntityManager em = getSession();
    EntityTransaction tx = null;
    try {
        tx = em.getTransaction();
        tx.begin();
        em.persist(object);
        tx.commit();
    } catch (RuntimeException e) {
        if (tx != null)
            tx.rollback();
        throw e; // or display error message
    } finally {
        em.close();
    }
    return object.getId();
}


/**
 * @generated
 */
public void delete(de.cw.minifigfinder.model.UIValues object) {
    if (object == null)
        throw new IllegalArgumentException("object");
    getSession().remove(object);
}

}

于 2012-09-20T18:15:46.810 に答える