No transaction in progress
connysvensson Jun 5, 2008 4:41 PMI'm using Seam 2.0.2SP1 and GWT 1.5RC1. I'm having some problems merging entities. I get an TransactionException No transaction in progress
. I've done a project in Seam before using the regular JSF presentation layer but now I'm moving to GWT. Is there anything special I need to setup for persistence management to get it to work? Querying the backend works fine but not merging or persisting. Here is my code:
@Scope(ScopeType.EVENT)
@Name("SaveEmployee")
public class SaveEmployeeHandler extends RpcEventHandler<SaveEmployee, RpcEntityResult> {
@Logger Log log;
@In EntityManager entityManager;
@Override
@Transactional(TransactionPropagationType.REQUIRED)
protected RpcEntityResult doHandle(SaveEmployee request) throws RpcException {
log.info("Saving employee with id: #0", request.getEntity().getId());
// Updated entity from client
Employee clientEmp = (Employee) request.getEntity();
// Get attached entity from backend
Employee dbEmp = (Employee) entityManager.find(Employee.class, clientEmp.getId());
// Merge client and backend entities (this should be done with hibernate4gwt)
dbEmp.setFirstName(clientEmp.getFirstName());
dbEmp.setLastName(clientEmp.getLastName());
try {
//entityManager.getTransaction().begin();
//Transaction.instance().begin();
entityManager.joinTransaction(
dbEmp = entityManager.merge(dbEmp);
entityManager.flush();
} catch (Exception ex) {
throw new RpcException(ex);
}
return new RpcEntityResult(dbEmp);
}
}It crashes on the flush operation. The commented lines are things I've tried to start a transaction but haven't worked. I'm currently using the following code and it works but it feels like it shouldn't be necessary, it's not the regular Seam way.
Session session = (Session) entityManager.getDelegate(); session.saveOrUpdate(dbEmp); session.flush();
Anyone with an idea why the Seam container doesn't start a transaction automatically for me as it should? I read somewhere that it starts the transaction in the JSF lifecycle but I'm not using JSF. I have marked the method as Transactional so that should take care of it, right?