Вопрос

У меня есть пара вопросов, касающихся использования менеджера сущности в среде Javase.

Я использую шаблон репозитория для выполнения моих операций CRUD в базе данных. Там будет базовый класс репозитория, как так:

public class Repository<T> implements IRepository<T> {

    private EntityManager em;
    private String persistenceUnitName;

    public Repository(String persistenceUnitName) {
        this.persistenceUnitName = persistenceUnitName;
    }

    @Override
    public T find(Class<T> type, Object id) {
        return em.find(type, id);
    }

    private EntityManager getEntityManager() {
        if (this.em == null) {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistenceUnitName);

            em = emf.createEntityManager();
        }

        return em;
    }
    ...
    ...
}

Затем у меня будут классы, такие как сотрудничество, которые наследуют репозиторий. Эти классы репозитория будут созданы в моем сервисном слое.

Это хороший способ инициализации менеджера сущности? Я начинаю думать, что это не так - кажется, что вы должны иметь только один менеджер по суждению на единицу настойчивых? Где, как и в этом случае у вас будет менеджер сущности для каждого репозитория, который вы создаете ... Как бы вы ходили, чтобы у вас был только один менеджер по суждению за настойчивость? Кроме того, я заметил, что методы менеджера менеджера Entity и Entity Manager имеют тесный метод - когда они должны быть вызваны? На сервере терминал событие?

Если вы знаете какие-либо хорошие источники об использовании JPA в Javase, я был бы признателен за информацию.

Спасибо!

Это было полезно?

Решение

Почти. Вам нужен только один объект управления на постоянство.

Как бы вы пошли по обеспечению того, чтобы у вас был только один объект управления на постоянство?

Обычно разработчики создают класс помощника с синглтоном сущноманагентиоров, таких как

public class EntityManagerFactoryHelper {

    private static EntityManagerFactory factory;

    static {
        try {
           // Set up factory right here
        } catch(ExceptionInInitializerError e) {
            throw e;
        }
    }

    public static EntityManagerFactory getFactory() {
        return this.factory;
    }

}

Entitymanager, В другой руке используется для взаимодействия с набором экземпляров управляемых сущностей, называемых контекстом постоянства.

Если вы хотите знать, почему я использую ReverininitializerError., его API ясен

Сигналы, что неожиданное исключение произошло в Статический инициализатор

...

Это хороший способ инициализации менеджера сущности?

Ну, сервисный слой используется для разграничения границы транзакции. Отказ Так Для каждого использования, вы можете создать свой EntityManager и пройти посредством ссылки для каждого колоборатора Нужно помочь вам выполнить ваш случай использования.

public static br.com.helper.EntityManagerFactoryHelper.getFactory;

public EmployeeService {

    public void doSomething() {
        EntityManager eManager = getFactory().createEntityManager();
        eManager.getTransaction().begin();

        EmployeeRepository repository = new EmployeeRepository(eManager);

        eManager.getTransaction().commit();
    }

}

Теперь представьте, что вам нужен код BoeterPlate, показанный выше для каждого корпуса использования.

    public void forEachUseCase() {
        // Create an EntityManager
        // Begin a Transaction

        EmployeeRepository repository = new EmployeeRepository(eManager);

        // And finally, commit
    }

Вы можете положиться на Весна Чтобы помочь вам избавиться от этого кода котельной.

Другие советы

Брайан,

Это в порядке, чтобы поделиться EntityManagerFactory, но не в порядке, чтобы поделиться EntityManager. Увидеть Ява настойчивости Викибук.

Более современный подход будет делать синглтонов с помощью перечисления. Итак, предположив, что вы не ожидаете, что вы не обращаете за изменения имени блоков настойчивых (я ожидаю, что не произойдет в любом случае) ...

Так в идеале ...

  1. Используйте Singleton для экземпляра EntiteManagerFactory, за единицу настойчивых.
  2. Создайте новый менеджер Entity на каждом вызове, чтобы получить один, и не делитесь их.

Использование enum для механизма Singleton обеспечивает ... (Эффективное java второе издание)

  1. Быть красным
  2. Обеспечивает сериализацию оборудования бесплатно
  3. Предотвращает множественное зрелищую атмосферу EntiteManagerFactory без проблем синхронизации. Это происходит, потому что конструкторы Enum вызываются по времени нагрузки класса и не могут быть вызваны вашим кодом.
  4. Обеспечивает EntityManager не передается, если программист не делает неверный выбор для этого.
public enum PersistenceUnitFactory
{
    PERSISTENCE_UNIT_1("persistenceUnit1"),
    PERSISTENCE_UNIT_2("persistenceUnit2");

    private final EntityManagerFactory emf;
    /**
     * Maps the persistence unit name to this instance of the enum.
     *
     * @param persistenceUnitName the name of the peristence unit in
     *                            persistence.xml
     *
     * @see #getPersistenceUnitName()
     */
    PersistenceUnitFactory(final String persistenceUnitName)
    {
        emf = Persistence.createEntityManagerFactory(persistenceUnitName);
    }

    /**
     * Creates a new {@link EntityManager}.  NEVER share this across threads.
     * 
     * @return a new {@link EntityManager}
     */
    EntityManager createEntityManager()
    {
        return emf.createEntityManager();
    }
}

Тогда это так же просто, как просить Entitymanager ...

PersistenceUnitFactory.PERSISTENCE_UNIT_1.createEntityManager();

Вы можете добавить больше единиц настойчивых, как вам нужны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top