【问题标题】:Inject a Hibernate Interceptor with Guice / GuicePersist使用 Guice / GuicePersist 注入 Hibernate 拦截器
【发布时间】:2017-07-22 20:43:29
【问题描述】:

我将 JPA 与 Guice Persist 用于我的 GAE 项目,将 Restlet 用于 REST 接口。在幕后,老 Hibernate 提供 JPA 服务。

这就像一个魅力,Guice 将必要的 JPA 部分注入到我的类中,例如 RestletServlet 中的 EntityManager

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

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

这行得通(是的,它很丑),我有一个带有 Guice 注入的 SessionInterceptor

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

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

我需要将 JPA (Hibernate) 配置与 Guice 中的 SessionInterceptor 连接 (bound),就像我在 RestletServlet 中所做的那样,但是如何操作?

谁能帮我完成这个 Guice 配置?

除此之外,当前的SessionInterceptorFactory 是一个“肮脏的 Guice hack”,有没有一个干净的 Guice 解决方案?

【问题讨论】:

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


    【解决方案1】:

    问题是您在 SessionInterceptorFactory 中创建了一个全新的(空的)注入器,而您想要做的是将它挂接到您在其他地方拥有的主注入器。

    在尝试将 Guice 集成到依赖注入之前的工具中时,这是一个相当常见的问题:如果配置只让您选择提供“工厂类”而不是接受实例,那么您别无选择,只能通过静态变量传递引用。您可以通过使用线程本地来使其变得非常健壮,但这并不是很令人满意。

    然而,在 Hibernate 的情况下,您可以通过使用 API 来构建您的 SessionFactory 而不是使用配置文件来整理它。您可以在构建您的SessionFactoryConfiguration 对象上调用setInterceptor 方法。你目前还没有展示你是如何创建这个的。

    【讨论】:

    • 您好,Tim,使用 Guice Persist,您可以在 createInjector 中使用 JpaPersistModule 并在 persistence.xml (github.com/google/guice/wiki/JPA) 中指定 JPA/Hibernate 配置。我将不得不检查这是如何使用代码完成的......
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2015-10-10
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多