Witam.
Robię sobie prostą webową aplikacje z EJB i mam problem z transakcjami.
Mam sobie takiego EJB
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class PlayerDao {
@PersistenceContext(unitName="prodPU")
private EntityManager em;
@Resource(mappedName="mail/fastom")
private Session mailSes;
@EJB
private Configuration conf;
/**
*
* @param email
* @param password
* @return registered player
* @throws EntityExistsException - when a user with the passed email
* already exists
*/
public Player registerPlayer(String email, String password)
throws EntityExistsException {
Query q = em.createNamedQuery("findPlayerByEmail");
q.setParameter("email", email);
List r = q.getResultList();
if(r.size() != 0) {
throw new EntityExistsException(conf.getGlobalResourceBundle()
.getString("register.mail.exists.error"));
}
Player p = new Player();
//...
em.persist(p);
return p;
}
public Player registerPlayerWithActivation(String email, String password,
String urlPreffix) throws EntityExistsException,
AddressException, MessagingException {
Player p = registerPlayer(email, password);
p.setActivationToken(new Random().nextInt());
em.persist(p);
sendActivationEmail(p, urlPreffix); // tu dostaje exception
return p;
}
i wykorzystuje w servlecie w ten sposób:
@WebServlet(urlPatterns={"/register.html"})
public class RegisterServlet extends HttpServlet {
@EJB
private PlayerDao playerDao;
@Override
protected void doPost(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//...
try {
try {
URL serverUrl = new URL(request.getRequestURL().toString());
Player p = playerDao.registerPlayerWithActivation(
request.getParameter("email"),
request.getParameter("password"),
"http://" + serverUrl.getHost() + "/activation.html?token=");
//...
} catch (EJBException ex) {
throw ex.getCausedByException();
}
} catch
//...
}
}
Jak widać w komentarzach dostaję wyjątek przy sendActivationEmail i to jest ok.
Problem w tym że mimo tego wyjątku transakcja nie jest rollback'owana i Player trafia do bazy danych.
Proszę o sugestie co mogę robić nie tak ?
Soft: Glassfish v3 + JavaDB (derby) + Netbeans
Mój persistance.xml:
<persistence-unit name="prodPU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/__default</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> </properties> </persistence-unit>W panelu admin Glassfish włączyłem wsparcie dla transakcji dla jdbc/__default