Создание новых сущностей при включении инъекции - PullRequest
1 голос
/ 02 июня 2011

У меня есть метод для сессионного компонента без сохранения состояния, который создает новый экземпляр объекта и сохраняет его.Обычно вы можете использовать новый MyEntity () для создания объекта, но я бы хотел, чтобы инъекция заполнила некоторые свойства сущности для меня.

Я получил частичный успех, используя

@Inject 
@New 
private MyEntity myNewEntity; 

всессионный компонент и затем использование этого экземпляра в моем методе.

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

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: дублирующую запись '9' для ключа 'PRIMARY'

Или, по крайней мере, поэтому я так думаюЯ получаю это исключение.Конечно, если я использую новый MyEntity (), я не получу исключение, но мое введение не произойдет.

Я не на том пути?Как я могу создать новый объект локальной сущности при включении инъекции?

Любая помощь будет отличной!

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Прежде всего - у меня есть серьезные сомнения, что это хорошая идея использовать CDI для управления жизненным циклом сущности.См. Эту цитату из документации ( здесь ):

Согласно этому определению, сущности JPA являются технически управляемыми компонентами.Тем не менее, сущности имеют свой собственный особый жизненный цикл, модель состояния и модель идентичности и обычно создаются JPA или используют new.Поэтому мы не рекомендуем напрямую вводить класс сущности.Мы особенно не рекомендуем назначать область, отличную от @Dependent, для класса сущностей, поскольку JPA не может сохранять внедренные прокси-серверы CDI.перенаправления, либо с помощью @Produces или @Unwraps (Seam Solder, если вам нужно, чтобы он действительно был без сохранения состояния), и тем самым удостоверившись, что код явно вызывает new.

0 голосов
/ 07 июня 2011

Я думаю, что сейчас у меня есть работающее решение, которое кажется нормальным, хотя я не совсем уверен, почему оно работает, поэтому жду ваших отзывов о лучшем решении. Сейчас я внедряю bean-компонент в стиле DAO в мой сессионный компонент без сохранения состояния:

@Stateless
public class PhoneService {

    @Inject
    protected ProblemReports problemReports;

Внедрение моей сущности в bean-компонент ProblemReports:

public class ProblemReports {

    @Inject
    @New
    private ProblemReport newProblemReport;

Я предполагаю, что ProblemReports по умолчанию имеет значение @Dependant scope, которое, как я понимаю, должно быть таким же, как и сессионный компонент без сохранения состояния, который его содержит. Я мог бы понять это, если бы область действия ProblemReports была короче, в результате чего при создании нового ProblemReports был создан новый экземпляр ProblemReport; но это не так.

Это просто пример того, что EJB и CDI не очень хорошо играют вместе?

...