@PersistenceContext не применим к параметрам.Как внедрить EntityManager через конструктор? - PullRequest
0 голосов
/ 01 февраля 2019

Лучше всего использовать инжектор конструктора.Однако я не могу добиться этого с помощью @PersistenceContext.

. Мне бы хотелось иметь следующий конструктор:

private final EntityManager entityManager;

@Autowired
public MyService(@PersistenceContext EntityManager entityManager) {
    this.entityManager = entityManager;
}

Но я не могу, поскольку @PersistenceContext применимо только к TYPE, METHOD и FIELD.

Q: Как внедрить управляемый контейнером EntityManager через инжекцию конструктора?

1 Ответ

0 голосов
/ 01 февраля 2019

Вы, кажется, используете spring, поэтому ваше решение будет довольно простым:

@Component
@Scope("prototype")
public class MyPersistenceContainer
{
@PersistenceContext
private EntityManager em;

public EntityManager getEntityManager()
{
return em;
}
}

И теперь вы можете просто внедрить экземпляр этого класса в своем конструкторе, он всегда будет содержать действительный EntityManager (потому чтобобовой области).Имейте в виду: в веб-среде вы, вероятно, должны использовать @SessionScope или даже @RequestScope вместо прототипа, это сэкономит ресурсы


Но есть что рассмотреть:

При использовании bean-компонентов с одинарной областью действия, которые имеют зависимости от bean-объектов, которые определены как прототипы, имейте в виду, что зависимости разрешаются во время создания экземпляра.Это означает, что если вы зависимостью внедрите bean-объект с прототипом в bean-объект синглтона, то будет создан экземпляр нового bean-компонента-прототипа, а затем зависимость будет введена в bean-объект singleton ... но это все.Точно такой же экземпляр прототипа будет единственным экземпляром, который когда-либо поступал в бин с одной областью действия, что хорошо, если вы этого хотите.

Однако иногда то, что вы на самом деле хотите, предназначено для единственной области действия.bean, чтобы иметь возможность снова и снова приобретать новый экземпляр bean-объекта с прототипом во время выполнения.В этом случае бесполезно использовать просто зависимость, внедряющую bean-объект с прототипом в ваш синглтон-компонент, потому что, как объяснялось выше, это происходит только один раз, когда контейнер Spring создает экземпляр синглтон-компонента и разрешает и внедряет его зависимости.Если вы находитесь в сценарии, в котором вам нужно снова и снова получать новый экземпляр (прототипа) bean-компонента во время выполнения, обратитесь к разделу, озаглавленному Раздел 4.3.7, «Внедрение метода»

Итак, если вы хотите внедрить ваш «контейнер-компонент управления объектами» в одноэлементные компоненты (это область по умолчанию) , взгляните на https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory-method-injection


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

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