2011-12-14 4 views
3

Мы используем CDI (JSR 299) в нашем приложении (JSF2/Seam3.0/Hibernate 3.5.6/GlassFish 3.1.1)CDI Инъекция в Hibernate Entities

В то время как мы не можем вводить ресурсы (Helper POJOs) в наших управляемых компонентах, использующих @Inject, мы не можем сделать то же самое в наших классах Hibernate Entity.

У нас есть базовый класс сущностей (@MappedSuperclass), из которого происходят все объекты сущности. В обоих классах происходит сбой CDI.

@MappedSuperclass 
public class BaseBusinessObject implements Serializable 
{  
    @Inject 
    private TestClass testClass; //FAILS 
} 


@Entity 
@NamedQueries({ @NamedQuery(name = "Account.findAll", query = "SELECT b FROM Account b") }) 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class Account extends BaseBusinessObject 
{ 
    @Inject 
    private TestClass testClass; //FAILS 

} 

Похоже, что это может быть ограничение с CDI. Может ли кто-нибудь подтвердить, работает ли CDI с объектами Hibernate.

Любые входы будут оценены.

Благодаря & уважением

ответ

3

Я действительно не знаю, КДИ, но я действительно не думаю, что это возможно. Событие, если бы мы могли, во многих случаях, это, вероятно, привело бы к действительно плохому дизайну.

Вы хотите, чтобы CDI создавал единый объект гибернации для всего приложения и вводил ваши помощники/службы/что-то в нем? Или вы хотите, чтобы CDI вводил материал в любое созданное вами сущность с помощью «нового объекта()»?


Edit: Вообще Дата Время Utils не имеет ни одно государство и не нуждается ни в КДИ впрыскивается материал, так почему бы не сделать все статические методы, как то, что мы находим в Apache Commons DateUtils?

Если ваше время по времени требует использования состояния, сделайте его синглом (но будьте осторожны при проблемах параллелизма).

Если ваше время Time utils необходимо вызвать другие CDI-компоненты (поэтому он не может быть статическим), тогда вы предпочтете сделать его одиночным, и добавьте в singleton другие CDI-компоненты.

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

+0

Привет Себастьена, Спасибо за ваш ответ. Мы используем несколько объектов Hibernate, но все они получают (базовые свойства, такие как время создания даты) из базового класса Entity. Мы пытаемся ввести класс утилиты Date Time Utility в этот базовый класс, чтобы получить время создания Entity, и эта инъекция не удалась. – gkari

2

Плохая практика для систематического использования объекта JPA как компонента CDI (но это возможно, если вы хотите). Это в основном из-за «C» CDI: контекст.

Все реализации CDI используют механизм прокси-сервера для обработки инъекции компонента данной области в компоненте различной области видимости. И поскольку в большинстве приложений JPA используется также прокси-сервер для управления некоторым механизмом (например, Lazy Loading), вы закончите с кучей прокси-серверов в своем классе с разными жизненными циклами: беспорядок!

Weld документация, даже убывающий об этой проблеме: Chapter 5. Scopes and Contexts

Однако это может быть полезно в некоторых случаях, чтобы выставить объект как КДИ боб, но вы предпочли бы использовать продюсер сделать так:

@Produces 
@Named 
@RequestScoped 
private MyEntity produceMyEntity() 
{ 
    return new MyEntity(); //or any JPA lookup you'll need 
} 

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

+0

Привет Антуан, Спасибо за ваш ответ. Мы не пытаемся создать объект с использованием CDI. Предприятие создается с использованием оператора new(). Однако, , как указано для Себастьяна, все наши объекты получают (основные свойства, такие как время создания даты) из базового класса Entity. Мы пытаемся ввести класс утилиты Date Time Utility в этот базовый класс, чтобы получить время создания Entity, и эта точка инъекции терпит неудачу. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. – gkari