hibernatejpaguiceguice-servletguice-persist

Inject a Hibernate Interceptor with Guice / GuicePersist


I'm using JPA with Guice Persist for my GAE projects and Restlet for the REST interface. Under the hood good old Hibernate delivers the JPA service.

enter image description here enter image description here

This works like a charm, and Guice injects necessary JPA parts into my classes, for example an EntityManager in the RestletServlet;

enter image description here

Now i want to use a SessionInterceptor to insert create/edit timestamps and current active users to my entities. In old projects i used a static HibernateUtil class with ThreadLocal variables to store the sessions. In my new project i want to solve this with Guice. Guice needs to inject an EntityManager in my SessionInterceptor so i can load the current active user from the database.

The SessionInterceptor needs to be created in a Hibernate context and its not permitted to configure this after startup. Therefore i created a SessionInterceptorFactory which uses a Guice Injector. In persistence.xml

enter image description here

enter image description here

This works (yes its ugly), i have a SessionInterceptor with Guice Injection.

enter image description here

But when i try this code;

enter image description here

[ERROR] 1) No implementation for javax.persistence.EntityManager was bound. [ERROR] while locating com.google.inject.Provider [ERROR]
for the 1st parameter of com.ludus.server.hibernate.SessionInterceptor.(SessionInterceptor.java:20) [ERROR] while locating com.ludus.server.hibernate.SessionInterceptor

I need to connect (bound) the JPA (Hibernate) configuration with the SessionInterceptor in Guice like i did with the RestletServlet, but how?

Who can help me with this Guice configuration?

Apart from this, the current SessionInterceptorFactory is a 'dirty Guice hack', is there a clean Guice solution for this?


Solution

  • The problem is that you're creating a brand new (and empty) injector in your SessionInterceptorFactory, when what you want to do is to hook it into the main injector you have elsewhere.

    This is a fairly common problem when attempting to integrate Guice into tools that pre-date dependency injection: If the config only gives you the option to provide a "factory class" rather than accepting an instance, then you have no choice but to pass the reference via a static variable. You can make this pretty robust by doing it with a thread-local, but it's not very satisfactory.

    In the case of Hibernate however, you can tidy this up by using the API to build your SessionFactory rather than using the configuration file. You can call setInterceptor method on the Configuration object which builds your SessionFactory. You haven't shown how you're creating this at the moment.