当前位置: 首页 > 知识库问答 >
问题:

jpa2使用guice重用entityManager

阎昌勋
2023-03-14

我已经验证了@transaction方法是否正确放置,并且在调试堆栈中,我看到事务拦截器和实体管理器是根据对后端的请求创建的(因此没有guice持久性过滤器

我的感觉表明问题在于会话上下文。我感觉(但我不能真正理解)它在多个请求上重用了我的持久性上下文。

我已经把一些框架放在一起,使这一切都能工作。我使用resteasy作为jax的实现者。guice(4.0beta4)作为cdi实现者,hibernate作为jpa实现者。因为在注入entitymanager时需要使用提供者(因为entitymanager是在每个事务中创建的),所以我将其包装在entitymanager Proxy中。此类实现EntityManager接口,并将所有方法委托给提供者。get()。方法()。

public class EntityManagerProxy implements EntityManager {
    private final Provider<EntityManager> entityManagerProvider;

    @Inject
    public EntityManagerProxy(final Provider<EntityManager> entityManagerProvider) {
        this.entityManagerProvider = entityManagerProvider;
    }

    private EntityManager getEntityManager() {
        return entityManagerProvider.get();
    }

    @Override
    public void persist(final Object entity) {
        getEntityManager().persist(entity);
    }
}

我的guice模块看起来像这样

public class OptiWEEEModule extends ServletModule implements Module {
    @Override
    protected void configureServlets() {

        super.configureServlets();
        bind(EntityManagerProxy.class);
        // JPA
        install(new JpaPersistModule("myPU"));
    }
}

我知道这是一个模糊的问题,但是有人能在正确的方向上帮助我吗?这不是一个我可以提供错误消息的问题。

编辑:我现在指出了问题。用一个分析器,我看了一个实体上下文被guice重用。这意味着它不是每次都执行查询,而是使用现有的实体管理器,每次传递@事务性注释时都应该创建该实体管理器。

共有1个答案

毋宪
2023-03-14

我从邮件列表中找到了这个awnser。

Guice perstist有一个非常不寻常的特性,它会导致一些问题。我想你可能只是在打它

当您请求工作单元之外的实体管理器时,guice persist将隐式启动您的工作单元。不幸的是,UnitOfWork上的isActive()是包私有的。您无法测试某个工作单元是否处于活动状态。

有两种方法可以显式地开始和结束一个工作单元。您可以使用UnitOfWork和方法begin()和end()。此外,@Transactional注释还启动了一个工作单元@事务性也将结束工作单元,当且仅当它启动它时。

最佳做法是仅在@Transactional方法中获取实体管理器。

我只能断定@Transaction注释的成熟度与spring中的不同。另一方面,通过提供者在@Transactional manager中获取实体管理器并不能真正解决这个问题。

因为我们很快就要投入生产了,所以我又回到了Spring,这是一个耻辱,但这是管理我们最后期限的唯一明智的解决方案。

 类似资料:
  • 根据这个问题,当使用时,是事务范围。如果我理解正确,这意味着将为每个事务创建一个新的。使用时,建议使用提供所有绑定的,只需插入

  • 问题内容: JPA和Hibernate当前都不支持JDK8中JSR-310带来的新日期/时间类(JPA 票证,Hibernate 票证)。尽管如此,我还是希望使用JDK8日期/时间类进行编码,因为它们最终经过了精心设计。特别是,我对感兴趣,而不是不完全支持所有类型,因为我的所有实体都将使用此特定类(或者,所以我认为现在至少是:-) 一种选择是编写一个JPA 2.1定义的类型转换器。但是,我们的应用

  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 我有一个Maven模块,我在其中定义了一些跨其他几个Maven模块共享的UTIL。在本模块中,我想创建一些单例: 然后我将我的界面绑定到: 假设我想使用另一个Maven模块(比如web服务)中的这个单例,我该如何实现呢?我找到的唯一方法是在util Maven模块中创建一个类,如: 或者,我可以在Guice教程中看到的静态main方法中创建注入器,并将实例保存在某个地方。 然后从我的Web服务中执

  • 问题内容: 如何在hibernatePOJO上实现我的唯一约束?假设数据库不包含任何内容。 我在注解中看到了唯一属性,但无法正常工作吗? 如果我想将此约束应用于多个列怎么办? 问题答案: 基本上,没有数据库支持就无法实现唯一约束。 和属性是架构生成工具生成相应约束的指令,它们本身并没有实现约束。 您可以在插入新实体之前进行某种手动检查,但是在这种情况下,您应该意识到并发事务可能存在的问题。 因此,

  • 问题内容: 我已经阅读了https://github.com/google/guice/wiki/AssistedInject,但是没有说明如何传递AssistedInject参数的值。jector.getInstance()调用会是什么样? 问题答案: 检查FactoryModuleBuilder类的javadoc 。 允许您动态配置类,而不是自己编写。当您的对象具有应注入的依赖项以及在对象创建