用Guice / GuicePersist

时间:2017-07-22 20:43:29

标签: hibernate jpa guice guice-servlet guice-persist

我在GAE项目中使用JPA Guice Persist,在REST界面使用Restlet。在引擎盖下,旧的Hibernate提供了JPA服务。

enter image description here enter image description here

这就像魅力一样,Guice将必要的JPA部分注入我的课程,例如EntityManager中的RestletServlet;

enter image description here

现在我想使用SessionInterceptor向我的实体插入创建/编辑时间戳和当前活动用户。在旧项目中,我使用带有ThreadLocal变量的静态HibernateUtil类来存储会话。在我的新项目中,我想用Guice解决这个问题。 Guice需要在EntityManager中注入SessionInterceptor,以便我可以从数据库中加载当前活动用户。

需要在Hibernate上下文中创建SessionInterceptor,并且不允许在启动后配置它。因此我创建了一个使用Guice Injector的SessionInterceptorFactory。在persistence.xml

enter image description here

enter image description here

这是有效的(是的,它的丑陋),我有一个SessionInterceptor与Guice Injection。

enter image description here

但是当我尝试这段代码时;

enter image description here

  

[错误] 1)没有javax.persistence.EntityManager的实现   界。定位时出现[错误]   com.google.inject.Provider [错误]
  对于第一个参数   com.ludus.server.hibernate.SessionInterceptor。(SessionInterceptor.java:20)   找到com.ludus.server.hibernate.SessionInterceptor

时出现[错误]

我需要将{({1}})JPA(Hibernate)配置与Guice中的bound连接,就像我使用SessionInterceptor一样,但是如何?

谁可以帮我处理这个Guice配置?

除此之外,当前RestletServlet是一个'脏Guice hack',有没有一个干净的Guice解决方案呢?

1 个答案:

答案 0 :(得分:0)

问题是你在SessionInterceptorFactory中创建了一个全新的(和空的)注射器,当你想要做的是将它挂钩到你在其他地方的主注射器时。

当尝试将Guice集成到依赖注入之前的工具时,这是一个相当常见的问题:如果配置只为您提供了提供“工厂类”而不是接受实例的选项,那么您别无选择,通过静态变量传递引用。

,你可以通过本地线程来做到这一点非常强大。但是它并不是很令人满意。

但是,对于Hibernate,您可以使用API​​构建SessionFactory而不是使用配置文件来整理它。您可以在构建Configuration的{​​{1}}对象上调用setInterceptor方法。你现在还没有表明你是如何创造这个的。