JPA EntityManager,它是如何工作的?

时间:2009-09-07 17:36:43

标签: hibernate jpa entitymanager

很抱歉这个noob问题,但是我遇到了JPA + Hibernate的问题,所以我觉得我的想法并不清楚。 我有一些实体,比如A,B,C,D,我编写了AMethods,BMethods,CMethods,DMethods。每个* Methods类都包含通过EntityManagerFactory进行的EntityManager初始化以及一些基本上执行查询的方法。我不知道我是否应该使用单例模式(因此我有每个* Method类的EntityManager)或者每次执行查询时我是否需要打开和关闭EntityManager,或者我是否持久保存/删除实体...你能救我吗?

4 个答案:

答案 0 :(得分:8)

在典型的JPA / Hibernate应用程序中,您不会将持久性逻辑放在实体类本身中。与旧的EJB 2.x应用程序相比,这是设计理念的重大变化。相反,许多应用程序创建一个数据访问对象层 - 与实体分开 - 使用EntityManager实例来查询,加载和保存实体。通常,这些是单例,DAO中的实体管理器实例是线程的本地实例。

如果使用类似Spring的框架,则EntityManager实例和事务的管理是完全自动的。与EJB 3相同,虽然我没有在大型项目中使用它。我建议阅读Spring文档关于Object-Relational Mapping数据访问的章节。即使您最终没有在应用程序中使用Spring,本章也提供了一些关于如何以分层方式构建应用程序的一些很好的技巧,将持久性问题与持久化实体分开。祝你好运!

答案 1 :(得分:2)

EntityManager与持久性上下文相关联。如果您的所有实体都与一个上下文相关联,请使用单例模式。 你在服务器端使用jpa,对吗?如果是这样,您可以在init方法中初始化EntityManager,例如servlet上的init()。

答案 2 :(得分:1)

我希望这张照片能回答您的问题。 enter image description here

答案 3 :(得分:-1)

就像这样!

公共接口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 ();

}

公共类ProtokollDAOImpl实现了ProtokollDAOService {     private static final String PERSISTENCE_UNIT_NAME =“ProtokollManager”;     private EntityManagerFactory entityFactory;

/*
 * (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
}

}