Zmieniłem menedżera encji aplikacjiFabryka od wiosennego zarządzania do zarządzania kontenerami i natknęła się na problem. Podczas tworzenia podmiotu, są chwile, kiedy muszę go odpytać w ramach tej samej transakcji, w której został pierwotnie utworzony, zanim zostanie on automatycznie wypróżniony na końcu. Wiosną menadżer jednostki (chyba) automatycznie wypłukuje kontekst przed uruchomieniem find i będzie mógł zwrócić poprawny obiekt, ale w jboss metoda find zwraca wartość null.
Oto próbka problemu:
@PersistenceContext
private EntityManager entityManager;
private void test(){
Person person = new Person("firstname", "lastname", "email", "user", "pass", Person.PersonType.admin);
entityManager.persist(person);
assert person.getId() != null;
Person person2 = entityManager.find(Person.class, person.getId());
assert person2 != null; //fail in jboss, ok in Spring
}
Jeśli spróbuję dodać entityManager.flush()
zadzwoń pomiędzy persist()
i find()
metody, jboss rzuca a javax.persistence.TransactionRequiredException: no transaction is in progress
błąd, niezależnie od tego, czy wrzucam adnotacje @Transactional wokół metody / klasy przeprowadzającej test.
Moje zestawy plików persistence.xml <property name="org.hibernate.FlushMode" value="auto"/>
, ale wydaje się, że nie działa.
Czy jest jakaś właściwość konfiguracyjna, której nie udało mi się przekazać jbossowi, aby opróżnił swój kontekst do bazy danych przed uruchomieniem funkcji Znajdź? Czy mogę nieprawidłowo zamawiać moje oświadczenia?
Włożyłem mój persistence.xml i my-ds.xml pliki na pastebin.
Dzięki za pomoc.
Edytować
Zdecydowany. Zobacz komentarze poniżej
Odpowiedzi:
0 dla odpowiedzi № 1Wkrótce po załadowaniu pliku spring-data.xml zdałem sobie sprawę, że zapomniałem o fasoli. Po dodaniu tag @Transactional działał zgodnie z oczekiwaniami, a problem został rozwiązany.