Transakcje - hibernate, jpa, jta

0

Witam,

od dwóch dni męczę się z transakcjami w jta. Chciałem prosić o pomoc bardziej doświadczone osoby. Gdy próbuje zapisać do bazy model, który nie ma żandych relacji z innymi modelami to nie ma żadnego problemu. I robie to w taki sposob (część metody serwisowej):

dao.transactionOpen();
Model model = dao.save(model);
dao.transactionCommit();

metoda transactionOpen wywoluje:

 
utx.begin(); //utx - UserTransactionManager

a transactionCommit:

try {
     utx.commit();
} catch (Exception e) {
     utx.rollback();
     throw e;
}

i jeszcze metoda save z dao:

return em.merge(entity); // em - EntityManager

Problem pojawia się w momencie gdy próbuje zapisać model z relacją OneToMany:

dao.transactionOpen();

ModelB modelB = new ModelB();
modelB.getModelsA().add(modelA);

dao.save(modelB);

dao.transactionCommit();

Po stronie modelA mam adnotację:

@ManyToOne
@JoinColumn(name="model_b")

a po stronie modelB:

@OneToMany(mappedBy="modelsA", cascade = CascadeType.PERSIST)

Przy próbie zapisu czegoś takiego do bazy dostaję:

java.lang.IllegalStateException: No transaction associated with current thread
	at org.apache.geronimo.transaction.manager.TransactionManagerImpl.rollback(TransactionManagerImpl.java:262)
	at core.dao.impl.GenericDaoImpl.transactionCommit(GenericDaoImpl.java:66)

Komunikat jest jasny i zrozumiały ale nie wiem dlaczego tak się dzieje. Czy utx.begin() nie tworzy nowej transakcji? W czym jest problem? A może brakuję jakiejś adnotacji?

0

Jakby ktoś miał podobny problem - po zmianie typu kaskadowego z PERSIST na ALL wszystko jest ok.

0

Nie działało bo kaskadowość miałeś ustawioną na Persist, a wykonywałeś Merge(co jest bez sensu, bo nie miałeś nic do zmergowania). Ustawianie wszędzie Cascadetype.All nie jest zbyt przyszłościowe, o czym przekonasz się już przy najbliższym Delete np. ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.