首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多数据库+多租户Hibernate JPA中的Hbm2dll初始化

多数据库+多租户Hibernate JPA中的Hbm2dll初始化
EN

Stack Overflow用户
提问于 2016-10-26 11:03:57
回答 1查看 665关注 0票数 1

如何使用LocalContainerEntityManagerFactoryBean?使用hbm2dll初始化多个数据库

在MultiTenancy中,每个租户使用不同的数据源。我在ApplicationContext.xml中有一个id“ApplicationContext.xml”的默认数据源,我使用" datasource“的属性(但更改url )为每个租户生成一个数据源。我将它们添加到自定义MapDataSourceLookup中。

我尝试使用LocalContainerEntityManagerFactoryBean配置JPA初始化。

代码语言:javascript
复制
<bean class="org.springframework.orm.jpa.JpaTransactionManager"
    id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactory" >
    <property name="persistenceUnitManager" ref="pum"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="${database.dialect}" />
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.multi_tenant_connection_provider" value-ref="multitenancyConnectionProvider"/>
            <entry key="hibernate.tenant_identifier_resolver" value-ref="tenantResolver"/>                                              
        </map>
    </property>
</bean>

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="dataSourceLookup" ref="dataSourceLookup"/>
    <property name="persistenceXmlLocations">
        <list>
            <value>classpath:META-INF/persistence.xml</value>
        </list>
    </property>
</bean>


<bean class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"
    id="dataSource">
    <property name="driverClass" value="${database.driverClassName}" />
    <property name="jdbcUrl" value="${database.url}" />
    <property name="username" value="${database.username}" />
    <property name="password" value="${database.password}" />
    <property name="idleConnectionTestPeriod" value="${database.idleConnectionTestPeriod}" />
    <property name="idleMaxAge" value="${database.idleMaxAge}" />
    <property name="maxConnectionsPerPartition" value="${database.maxConnectionsPerPartition}" />
    <property name="minConnectionsPerPartition" value="${database.minConnectionsPerPartition}" />
    <property name="partitionCount" value="${database.partitionCount}" />
    <property name="acquireIncrement" value="${database.acquireIncrement}" />
    <property name="statementsCacheSize" value="${database.statementsCacheSize}" />
    <property name="releaseHelperThreads" value="${database.releaseHelperThreads}" />
</bean>

我有一个自定义的@component dataSourceLookup被注入,它以这种方式创建不同的数据源。

代码语言:javascript
复制
        //Add new datasource with configuration from "dataSource" and new url per tenant
        BoneCPDataSource customDataSource = new BoneCPDataSource(defaultDataSource.getConfig());
        customDataSource.setJdbcUrl(props.getProperty("database.url"));
        addDataSource(tenantId, customDataSource);

        logger.info("Configuring tenant: " + tenantId + " Properties: " + customDataSource.toString());

这是我的persistence.xml:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit"
    transaction-type="RESOURCE_LOCAL">      
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>     
    <properties>            
        <property name="hibernate.hbm2ddl.auto" value="update" />
        <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
        <property name="hibernate.connection.charSet" value="UTF-8" />
        <property name="hibernate.show_sql" value="true" />         

        <!--  Multi-tenancy properties -->
        <property name="hibernate.multiTenancy" value="DATABASE" />
    </properties>
</persistence-unit>

目前正在创建的唯一方案是默认数据库。但是指向其他数据库的数据源并没有被创建。当我试图访问用户时会产生此错误,因为用户表不存在:

原因: org.hsqldb.HsqlException:用户缺少特权或对象,找不到:用户

EN

回答 1

Stack Overflow用户

发布于 2016-11-09 11:00:45

我需要通过使用自定义扩展类LocalContainerEntityManagerFactoryBean并实现方法LocalContainerEntityManagerFactoryBean emf,PersistenceUnitInfo pui来解决这个问题。

在这种方法中,我循环不同的数据源并在每次迭代中使用该数据源创建实体管理器,我知道这不是最好的,但是如果您知道一个更好的解决方案,我想听:)。多租户中的hibernate目前不支持Schemaexport,这是我找到的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40260619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档