12

初心者の質問で申し訳ありませんが、JPA + Hibernateに問題があるため、何かがはっきりしていないと思いました。A、B、C、Dなどのいくつかのエンティティがあり、AMethods、BMethods、CMethods、DMethodsをコーディングしました。各 *Methods クラスには、EntityManagerFactory による EntityManager の初期化と、基本的にクエリを実行するいくつかのメソッドが含まれています。シングルトン パターンを使用する必要があるかどうか (*Method クラスごとに EntityManager を使用するため)、またはクエリを実行するたびに EntityManager を開いたり閉じたりする必要があるかどうか、またはエンティティを永続化/削除する必要があるかどうかはわかりません...手伝って頂けますか??

4

4 に答える 4

9

通常の JPA/Hibernate アプリケーションでは、永続化ロジックをエンティティ クラス自体に配置しません。これは、古い EJB 2.x アプリケーションと比較して、設計思想の大きな変化です。代わりに、多くのアプリケーションは、EntityManager インスタンスを使用してエンティティのクエリ、読み込み、および保存を行うデータ アクセス オブジェクトのレイヤーを (エンティティとは別に) 作成します。多くの場合、これらはシングルトンであり、DAO 内のエンティティ マネージャー インスタンスはスレッドに対してローカルです。

Spring のようなフレームワークを使用すると、EntityManager インスタンスとトランザクションの管理は完全に自動化されます。EJB 3 と同じですが、大規模なプロジェクトでは使用していません。オブジェクト リレーショナル マッピングデータ アクセスに関する Spring ドキュメントの章を読むことをお勧めします。アプリケーションで Spring を使用しなくなった場合でも、この章では、永続化の問題を永続化されるエンティティから分離する階層化された方法でアプリケーションを構造化する方法について、いくつかの優れたヒントを提供します。幸運を!

于 2009-09-07T17:53:22.023 に答える
3

EntityManager は永続コンテキストに関連付けられています。すべてのエンティティが 1 つのコンテキストに関連付けられている場合は、シングルトン パターンを使用します。サーバー側でjpaを使っていますよね?その場合、サーブレットの init() のように、init メソッドで EntityManager を初期化できます。

于 2009-09-07T17:48:44.920 に答える
1

この写真があなたの質問に答えてくれることを願っています。 ここに画像の説明を入力

于 2020-05-21T09:23:26.373 に答える
-2

ちょうどこのような!

パブリック インターフェイス ProtokollDAOService {

/**
 * Fügt ein Protokollobjekt in die Datenbank hinzu.
 * 
 * @param object
 */
public void addProtokoll (ProtokollModel object);

/**
 * Läd aus einer Datenbank Protokoll-Elemente und fügt sie in eine Liste hinzu
 * 
 * @return List <ProtokollModel> Liste mit Protokoll-Elementen 
 */
public List <ProtokollModel> getProtokolls ();

/**
 * Liefert ein Protokoll-Element aus der Datenbank anhand der ID; 
 * 
 * @param id
 * @return ProtokollModel Protokoll-Element 
 */
public ProtokollModel getProtokollById (long id);

/**
 * Liefert eine Liste von Protokoll-Elementen anhand des Problem-Status 
 * 
 * @param solved
 * @return List <ProtokollModel> Liste mit Protokoll-Elementen   
 */
public List <ProtokollModel> getProtokollByProblemStatus (boolean solved);

/**
 * Liefert eine Liste von Protokoll-Elementen anhand des Aufgaben-Status 
 * 
 * @param ready
 * @return List <ProtokollModel> Liste mit Protokoll-Elementen
 */
public List <ProtokollModel> getProtokollByAufgabenStatus (boolean ready);

/**
 * Liefert ein Protokoll-Element anhand des Problems
 * 
 * @param problem
 * @return List <ProtokollModel> Liste mit Protokoll-Elementen   
 */
public List <ProtokollModel> getProtokollByProblem (String problem);

/**
 * Liefert ein Protokoll-Element anhand der Aufgabe
 * 
 * @param aufgabe
 * @return List <ProtokollModel> Liste mit Protokoll-Elementen
 */
public List <ProtokollModel> getProtokollByAufgabe (String aufgabe);

/**
 * Ausgabe der Protokoll-Tabelle
 * 
 */
public void printTable ();

}

public class ProtokollDAOImpl implements ProtokollDAOService { private static final String PERSISTENCE_UNIT_NAME = "ProtokollManager"; プライベート EntityManagerFactory エンティティ ファクトリー;

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#addProtokoll(model.ProtokollModel)
 */
public void addProtokoll(ProtokollModel object) {
    try
    {
        entityFactory = Persistence
                .createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = entityFactory.createEntityManager();

        // Transaction starten
        em.getTransaction().begin();

        // Object zum speichern
        em.persist(object);

        // commit senden an die DB / Transaction abschliessen
        em.getTransaction().commit();

        // DB connection schliessen
        em.close();
    }
    catch (Exception e)
    {
        Logger.console("Exception wurde ausgelösst! " + e);
        e.printStackTrace();
    }
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokollByAufgabe(java.lang.String)
 */
public List<ProtokollModel> getProtokollByAufgabe(String aufgabe) {
    // TODO Auto-generated method stub
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokollByAufgabenStatus(boolean)
 */
public List<ProtokollModel> getProtokollByAufgabenStatus(boolean ready) {
    // TODO Auto-generated method stub
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokollById(long)
 */
public ProtokollModel getProtokollById(long id) {
    try
    {
        entityFactory = Persistence
                .createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
        EntityManager em = entityFactory.createEntityManager();

        // Transaction starten
        em.getTransaction().begin();

        // Object aus der DB laden
        Query q = em.createQuery("select m from ProtokollModel m where m.id=:id");

        // Parameter setzen - siehe PreparedStatment
        q.setParameter("id", id);

        // liefert das Protokoll-Element zurück 
        ProtokollModel pm = (ProtokollModel) q.getSingleResult();

        // commit senden an die DB / Transaction abschliessen
        em.getTransaction().commit();

        // db connection schliessen
        em.close();

        return pm;
    }
    catch (Exception e)
    {
        Logger.console("Exception wurde ausgelösst! " + e);
        e.printStackTrace();
    } finally {

    }

    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokollByProblem(java.lang.String)
 */
public List<ProtokollModel> getProtokollByProblem(String problem) {
    // TODO Auto-generated method stub
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokollByProblemStatus(boolean)
 */
public List<ProtokollModel> getProtokollByProblemStatus(boolean solved) {
    // TODO Auto-generated method stub
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#getProtokolls()
 */
public List<ProtokollModel> getProtokolls() {
    // TODO Auto-generated method stub
    return null;
}

/*
 * (non-Javadoc)
 * 
 * @see util.ProtokollDAOService#printTable()
 */
public void printTable() {
    // TODO Auto-generated method stub
}

}

于 2009-11-18T08:22:07.950 に答える