2015-12-08 2 views
0

Есть ли способ вставить @Named bean в Singleton?Inject @Named, @Stateful @Singleton EJB

Вот класс, который должен быть введен

@Named 
@Stateful 
@ConversationScoped 
public class PlaySessionBean implements Serializable { 
    @PersistenceContext(unitName = "test-persistence-unit", type = PersistenceContextType.EXTENDED) 
    private EntityManager entityManager; 
.... 
} 

Компонент используется для просмотра полезности (генерируемой Forge)

Проблема заключается в том, что мне нужно получить доступ к PlaySessionBean от @Startup @Singleton

@Startup 
@Singleton 
public class StartupBean { 
    private static final Logger LOGGER = Logger.getLogger(StartupBean.class.getName()); 

    private EntityManager entityManager; 
    private static EntityManagerFactory factory = 
     Persistence.createEntityManagerFactory("wish-to-paris-persistence-unit"); 
    private List<PlaySession> playSessions; 

    @PostConstruct 
    public void run() { 
    this.entityManager = factory.createEntityManager(); 
    CriteriaQuery<PlaySession> criteria = 
     this.entityManager.getCriteriaBuilder().createQuery(PlaySession.class); 
    this.playSessions = 
     this.entityManager.createQuery(criteria.select(criteria.from(PlaySession.class))) 
      .getResultList(); 
    this.entityManager.close(); 
    } 
.... 

Но это всегда не удалось, и жаловался, что PlaySession не является Entity

Есть ли способ ввести Именованный компонент Stateful в Singleton? Если нет, есть ли обходной путь?

Благодаря

+0

Действительно ли ваша 'PlaySession' сущность? Является ли он аннотирован с помощью '@ Entity' и сопоставлен ли он с соответствующей таблицей репозитория с помощью аннотации' @ Table'? –

+0

Какой подход вы взяли и что сработали? –

+0

привет @BuhakeSindi, в соответствии с вашим ответом ниже, это сработало, и компонент состояния был введен в "singleton", как ожидалось. Большое спасибо! –

ответ

1

Вы смесительные CDI область видимости с состояниями EJB. Я предпочел бы, чтобы вы выбрали CDI или EJB, но не смешивали 2. Для одного управление транзакциями отличается между двумя архитектурами. Кроме того, жизненный цикл каждого объекта совершенно другой.

Если вы собираетесь использовать EJB и вызвать соответствующий сеансовый компонент, вы можете аннотировать свой сеансовый бит @Stateful как @LocalBean, так как ваш сеансовый компонент не является наследованием интерфейса.

Пример:

@Stateful 
@LocalBean 
public class PlaySessionBean implements Serializable { 

} 

Затем на вашем @Startup Singleton фасоль, вы можете просто ссылаться на него по:

@EJB 
private PlaySessionBean playSessionBean; 

Сессия Bean EJB-прежнему будет с сохранением состояния.

+0

Поскольку «PlaySessionBean» в моем проекте используется как CRUD для просмотра Forge, мне нужно создать еще один класс, который вводит 'EntityManager' и с указанными' @ Stateful' и '@ LocalBean' на него и вводит его в' @Startup @ Синглтон. Спасибо. это решение работает –