Czy ktoś wie, dlaczego to nie działa w sposób PostConstruct?
Powód 1 Nie można utworzyć ziarna, które jest jednocześnie @Stateful i @Singleton (No można, ale to nie ma sensu, ponieważ Singletons są również Stateful), który jest jednym z powodów, masz kłopoty. Nie ma wyjątków, ale tam jest konflikt, musisz to najpierw naprawić.
Wystarczy pamiętać:
Singleton fasola szparagowa, że jest mantains swój stan. W aplikacji jest tylko jedno wystąpienie Singleton i jest ono udostępniane wszystkim użytkownikom aplikacji. Ponieważ jest to wspólna (może lepiej powiedzieć współbieżna) komponent bean, istnieje potrzeba implementacji jakiegoś mechanizmu blokującego za pomocą adnotacji @Lock.
Stanowy fasolka to ziarno, które zachowuje każdy stan po transakcji. Podczas pracy z
Stateful ziaren każdy użytkownik otrzymuje kopię fasoli, która będzie trwać tak długo, jak długo sesji - trwa, aż metody, z dopiskiem @Remove nazywa
Powód 2 nawet jeśli działa, nie będzie można uzyskać dostępu do wyników, ponieważ są przechowywane w obiekcie o nazwie res, który jest dostępny tylko z metody init(). Przypuszczam, że chcesz przypisać tę zwróconą wartość do zmiennej priceSteps.
W każdym razie jest wiele błędów w twoim kodzie, ponieważ nie mówisz wszystkiego. Nie wiem, jakie są twoje wymagania systemowe, ale tutaj dałbym ci proste rozwiązanie, które pozwoli ci uzyskać dostęp do bazy danych:
Przypuszczam, że próbujesz w jakiś sposób zwrócić dane w cyklu życia komponent bean, ponieważ chcesz uniknąć ponownego wysyłania zapytań, jeśli komponent bean jest @ Stanowia. Chodzi o to, że nie musisz tego robić, możesz nadal produkować swoją fasolę @Stateless i unikać obciążania bazy danych wieloma pytaniami. Co należy zrobić, to utworzyć numer @NamedQuery.
więc opisywać swój podmiot PriceStep z @NamedQuery i tam wpisać ciąg kwerendy napisałeś.W tym linkiem znajdziesz informacje na temat sposobu korzystania @NamedQueries: http://docs.oracle.com/cd/B31017_01/web.1013/b28221/ent30qry001.htm
Następną rzeczą, jaką proponujesz jest do opisywania klasa PriceManagementBean jak * @Stateless *. Nie martw się, jeśli w każdym żądaniu zostanie utworzony nowy podmiot zarządzający, który w ogóle nie obciąża bazy danych, ponieważ współdziała ona z modelem domeny. Nie potrzebujesz @PostConstruct, po prostu zadzwoń do @NamedQuery, kiedy tylko potrzebujesz i gotowe. Serwer aplikacji zapisze go w pamięci podręcznej i przekaże go każdemu użytkownikowi, który tego wymaga, bez interakcji z bazą danych.
Tutaj codesnipet:
@Entity
@NamedQuery(
name="allPriceSteps",
queryString="SELECT ps FROM PriceStep ps"
)
public class PriceStep implements Serializable {
...
}
Teraz fasoli:
@Stateless
public class PriceManagementBean implements PriceManagement {
@PersistenceContext
private EntityManager em;
public List<PriceStep> getAllPriceSteps() {
Query query = em.createNamedQuery("allPriceSteps");
return query.getResultList();
}
}
Mam nadzieję, że jest to przydatne. Jeśli podasz więcej informacji na temat wymagań systemowych, możemy udzielić porady na temat najlepszej praktyki.
Zobacz http://stackoverflow.com/questions/2399769/is-it-okay-to-pass-injected-entitymanagers -to-ejb-beans-helper-classes-and-use – mglauche
W jaki sposób i gdzie są dodawane zapytania cenowe do bazy danych? – Puce
Twoja fasola jest opisana zarówno jako "Stateful" i "Singleton", co nie jest dozwolone. Jeśli twój kontener EJB nie obsługuje EJB 3.1, być może komponent bean jest rzeczywiście stanowy, a PostConstruct działa z nieokreślonym kontekstem transakcji, a serwer aplikacji nie obsługuje go tak dobrze? Z jakiego serwera aplikacji korzystasz? –