【问题标题】:Modifying spring LocalContainerEntityManageFactoryBean at runtime to change Hibernate dialect在运行时修改spring LocalContainerEntityManageFactoryBean 以改变Hibernate方言
【发布时间】:2016-10-21 18:00:45
【问题描述】:

我们正在使用spring LocalContainerEntityManageFactoryBean 。问题是我们必须在多租户环境中连接不同的数据库。需要找出一种方法,我们可以在运行时更改方言的LocalcontainerEntityMangerFactory bean jpa属性而无需重新启动

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    相反,您应该做的是使用其适当的方言初始化两个不同的 LocalContainerEntityManagerFactoryBean 实例,然后根据您的代码应与之交互的数据库简单地引用正确的 EntityManager

    @PersistenceContext(unitName = "dialect1PersistenceUnit")
    private EntityManager entityManager1;
    
    @PersistenceContext(unitName = "dialect2PersistenceUnit")
    private EntityManager entityManager2;
    

    如果事情必须是真正动态的,你有几个选择。

    如果您打算一次只使用一个数据源,您可以设置您的数据库,使其基于AbstractRoutingDataSource,并设置一个线程本地值来确定要使用的持久性上下文。通常,您会在调用事务管理方面之前在服务层包装器中设置线程本地值。

    另一种选择是注入EntityManagerFactory 而不是EntityManager 并即时构建自己的EntityManager,如下所示:

    Map props = new HashMap();
    props.put( "org.hibernate.dialect", YourDialectClass.class.getName() );
    
    EntityManager entityManager = entityManagerFactory.createEntityManager( props );
    

    HTH。

    【讨论】:

    • 我不能不采用这种方法,因为我们的应用程序指向 H2 作为默认数据源,我们可以动态配置租户(数据库)并且可以是 oracle、Mysql、MSSQl。在运行时我们必须决定方言
    • 更新了我的答案。
    • 感谢纳罗斯。我们必须采用动态创建实体管理器的方法。其他解决方案不起作用。
    猜你喜欢
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多