could you place a break point inside the persistUser() method and check
the callstack to see if there is a JpaLocalTxnInterceptor.
This class is responsible for handling the @Transactional annotation.
On 10/18/2013 11:06 AM, Dirk Vranckaert wrote:
I'm building a backend application for one of my Android applications.
My setup is Hibernate as ORM, MySQL as DB, Guice as DI and
Guice-Persist for the link between ORM and DI.
My webservice-endpoint class looks like this:
@Path("test")
public class TestEndpoint {
@Inject
private UserDao userDao;
@GET
@Path("persistUser")
@Produces(MediaType.TEXT_PLAIN)
@Transactional
public String persistUser() {
User user = new User();
user.setEmail("someem...@test.com");
user.setFirstName("FirstName");
user.setLastName("LastName");
user = userDao.persist(user);
return "ok";
}
}
When I manually manage the transaction it works and my entity is
persisted:
@Path("test")
public class TestEndpoint {
@Inject
private UserDao userDao;
@Inject
private Provider<EntityManager> em;
@GET
@Path("persistUser")
@Produces(MediaType.TEXT_PLAIN)
public String persistUser() {
((HibernateEntityManager)em.get()).getSession().getTransaction().begin();
User user = new User();
user.setEmail("someem...@test.com");
user.setFirstName("FirstName");
user.setLastName("LastName");
user = userDao.persist(user);
((HibernateEntityManager)em.get()).getSession().getTransaction().commit();
return "ok";
}
}
My UseDaoImpl that is injected via UserDao looks like this:
public abstract class UserDaoImpl {
@Inject
private Provider<EntityManager> em;
public EntityManager getEntityManager() {
return em.get();
}
public User persist(User instance) {
getEntityManager().persist(instance);
return instance;
}
public User findById(String id) {
return getEntityManager().find(User.class, id);
}
}
My GuiceContextListener looks like this:
public class GuiceContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
Injector injector = Guice.createInjector(
new DatabaseModule(),
new GuiceDaoModule(),
new GuiceServiceModule(),
new ServletModule()
);
return injector;
}
}
The DatabaseModule:
public class DatabaseModule extends AbstractModule {
private static final String JPA_UNIT = "myDB";
@Override
protected void configure() {
install(new JpaPersistModule(JPA_UNIT));
}
}
The GuiceDaoModule:
public class GuiceDaoModule implements Module {
@Override
public void configure(Binder binder) {
binder.bind(UserDao.class).to(UserDaoImpl.class);
}
}
And this is my web.xml configuration:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>MyApp</display-name>
<listener>
<listener-class>eu.vranckaert.test.guice.GuiceContextListener</listener-class>
</listener>
<!-- GUICE -->
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
When I do findById(..) I can also retrieve my record, so my DB
connection is working, I'm just not able to use the @Transactional
annotation...
So I found something about wrong scope of my EntityManager, but I have
no clue how I can change the entity manager's scope...
You guys have any idea what is wrong with my setup that the annotation
does not work?
Dirk
--
You received this message because you are subscribed to the Google
Groups "google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
Visit this group at http://groups.google.com/group/google-guice.
For more options, visit https://groups.google.com/groups/opt_out.
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to google-guice+unsubscr...@googlegroups.com.
To post to this group, send email to google-guice@googlegroups.com.
Visit this group at http://groups.google.com/group/google-guice.
For more options, visit https://groups.google.com/groups/opt_out.