Введение EntityManager по сравнению с EntityManagerFactory

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

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

В конце, мы закончили тем, что продвинули целый проект мерзавцу из-за всей информации, которая была потеряна при движении в подверсию.

, Что Вы теряете:

  1. отслеживание Слияния - вид.
  2. Надлежащая запись авторства изменений.

я говорю "вид" WRT № 1, потому что, если Вы держите одно дерево вместе, оно отследит слияния и материал, который Вы сделали с мерзавцем и обратились к подверсии, но после того как Вы пытаетесь клонировать это repo, или кто-то еще делает клон мерзавца-svn, Вы теряете это, и слияния становятся действительно болезненными снова.

материал авторства имеет большое значение мне, потому что я нахожу очень важным удостовериться, что люди получают кредит для работы, которую они делают.

68
задан Bhesh Gurung 6 February 2012 в 22:46
поделиться

4 ответа

Плюсы и минусы внедрения EntityManagerFactory по сравнению с EntityManager описаны в документации Spring здесь , я не уверен, что смогу улучшить это.

Сказав это, в вашем вопросе есть некоторые моменты, которые следует прояснить.

... Spring создаст новый экземпляр DAO для каждого веб-запроса ...

Это неверно. Если ваш DAO является компонентом Spring, то это синглтон, если вы не настроите его иначе с помощью атрибута scope в определении компонента. Создание экземпляра DAO для каждого запроса было бы безумием.

Аргумент в пользу внедрения EMF состоит в том, что это хорошая практика во всех ее всегда хорошо иметь ручку factory.

Этот аргумент не выдерживает никакой критики. Общая передовая практика гласит, что объект должен быть внедрен с минимальным количеством участников, необходимых для выполнения его работы.

51
ответ дан 24 November 2019 в 14:20
поделиться

Я записываю то, что наконец собрал. Из раздела « Реализация DAO на основе простого JPA » в Spring Reference:

Хотя экземпляры EntityManagerFactory являются потокобезопасными, EntityManager экземпляров нет. Введенный JPA EntityManager ведет себя как EntityManager, полученный из среды JNDI сервера приложений, как определено спецификацией JPA. Он делегирует все вызовы текущий транзакционный EntityManager, если таковой имеется; в противном случае он возвращается к вновь созданному EntityManager для каждой операции, фактически делая его использование потокобезопасных.

Это означает, что согласно спецификациям JPA экземпляры EntityManager не являются потокобезопасными, но если Spring обрабатывает их, они становятся потокобезопасными.

Если вы используете Spring, лучше внедрить EntityManager вместо EntityManagerFactory.

25
ответ дан 24 November 2019 в 14:20
поделиться

Я думаю, что это уже было хорошо освещено, но лишь для того, чтобы подчеркнуть несколько моментов.

  • DAO, если внедрен Spring, является singleton по умолчанию . Вы должны явно установить область видимости прототипа чтобы каждый раз создавать новый экземпляр.

  • Менеджер сущностей введен @PersistenceContext является потокобезопасным .

При этом у меня были некоторые проблемы с одноэлементным DAO в моем многопоточном приложении. В итоге я сделал DAO экземпляром bean-компонента, и это решило проблему. Итак, хотя документация может сказать одно, вы, вероятно, захотите тщательно протестировать свое приложение.

Продолжение:

Я думаю, что часть моей проблемы заключается в том, что я использую

@PersistenceContext(unitName = "unit",
    type = PersistenceContextType.EXTENDED)

Если вы используете PersistenceContextType.EXTENDED, продолжайте Учтите, что вам нужно, если я правильно понял, закрыть транзакцию вручную. Для получения дополнительной информации см. этот поток.

Еще одно продолжение:

Использование экземпляра DAO - крайне плохая идея. Каждый экземпляр DAO будет иметь свой собственный кеш постоянства, и изменения в одном кэше не будут распознаваться другими компонентами DAO. Извините за плохой совет.

9
ответ дан 24 November 2019 в 14:20
поделиться

Я обнаружил, что установка аннотации @Repository Spring в наших DAO и управление EntityManager с помощью Spring и внедрение аннотации @PersistenceContext - это наиболее удобный способ заставить все работать плавно. Вы получаете выгоду от потоковой безопасности общего EntityManager и преобразования исключений. По умолчанию общий EntityManager будет управлять транзакциями, если вы, например, объедините несколько DAO из менеджера. В конце концов вы обнаружите, что ваши DAO станут анемичными.

6
ответ дан 24 November 2019 в 14:20
поделиться
Другие вопросы по тегам:

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