I had the following JSF backing bean in my Webapp
@ManagedBean
class MyBackingBean implements Serializable {
private MyHibernateRepository repository;
...
@Transactional
public void save() {
....
repository.save(myObject);
}
}
When it gets to the repository.save method call – I get the following error
no transaction is in progress
I’ve got two questions
- Is this because of a bug like this?
- I believe there are two workarounds – are there any others?
2.1 First workaround – using
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus status) {
repository.save(myObject);
}
});
2.2 Second workaround
Create a helper class and annotate that instead.
2.3 (A possible third workaround would be to annotate @Transactional on a method of an inner class This is quite similar to 2.2).
When using Spring annotations (I know that
@Transactionalis a Sun standard – but you need an implementation) – Spring uses AOP to annotate to the class to add the transaction handling code. This only works for Spring beans. If your class is a backing bean for JSF – the Mojarra framework won’t insert its own transaction handling code to this annotation.Short answer –
@Transactionalworks for beans loaded by Spring. Otherwise you need to find a framework that supports it or assume it won’t work.