JPA EntityManager, как это работает?

@Vilmantas Baranauskas: Относительно этого ответа я прокомментировал бы, были ли у меня точки представителя, но я не делаю. Я хотел отметить что Встречный класс, определенный, там не ориентировано на многопотоковое исполнение, поскольку не достаточно просто синхронизировать inc (), не синхронизируя значение (). Другие потоки, называя значение (), как гарантируют, не будут видеть значение, если происхождение - перед отношениями не было установлено с обновлением.

12
задан Raffo 7 September 2009 в 17:36
поделиться

3 ответа

В типичном приложении JPA / Hibernate вы не помещаете логику сохранения в сами классы сущностей. Это большое изменение в философии дизайна по сравнению со старыми приложениями EJB 2.x. Вместо этого многие приложения создают отдельный от сущностей уровень объектов доступа к данным, которые используют экземпляры EntityManager для запроса, загрузки и сохранения сущностей. Часто это синглтоны, и экземпляры диспетчера сущностей внутри DAO являются локальными для потока.

Если вы используете фреймворк вроде Spring, управление экземплярами EntityManager и транзакциями полностью автоматическое. То же самое с EJB 3, хотя я не использовал это в большом проекте. Я бы посоветовал прочитать главу документации Spring о доступе к данным Object-Relational Mapping . Даже если ты не Если в конечном итоге использовать Spring в вашем приложении, в этой главе дается несколько хороших советов о том, как структурировать ваше приложение многоуровневым способом, который отделяет проблемы сохраняемости от сохраняемых сущностей. Удачи!

9
ответ дан 2 December 2019 в 22:05
поделиться

EntityManager связан с контекстом постоянства. Используйте одноэлементный шаблон, если все ваши объекты связаны с одним контекстом. Вы ведь используете jpa на стороне сервера? В таком случае вы можете инициализировать EntityManager в методах инициализации, например init () на сервлетах.

3
ответ дан 2 December 2019 в 22:05
поделиться

вот так!

открытый интерфейс 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 { частная статическая конечная строка PERSISTENCE_UNIT_NAME = "ProtokollManager"; частный 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
}

}

-1
ответ дан 2 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: