具有MultiTenancy的Hibernate搜索

时间:2014-12-30 11:56:58

标签: lucene hibernate-search multi-tenant

我的要求是每个租户的每个索引,我已经将hibernate配置为MultiTenant,我需要将每个租户的数据库索引到不同的索引。我已经看过dynamicSharding Strategy ..但是要求是动态的。它可以有n个分片,而不是关于每个租户存在的任何预先信息。甚至我的索引器应该以这样的方式工作。每当它发现hibernate请求获取索引时,它应首先索引该租户,然后搜索它。

我怎么做.. ??

任何人都可以给我一些例子。 请不要给hibernate doc链接...甚至是用于hibernate搜索的Jboss doc链接。

1 个答案:

答案 0 :(得分:0)

要对特定租户进行索引,您应该在应用程序上下文中添加部分Entitymanager的hibernate搜索属性,如下所示:

<bean depends-on="dataSource" id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.SQLServerDialect" />
            <property name="generateDdl" value="true"></property>
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="packagesToScan" value="xxx.xxxx..xxx." />
    <property name="persistenceUnitName" value="xxxxxx" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
            <prop key="hibernate.search.default.directory_provider">filesystem</prop>
            <prop key="hibernate.search.default.indexBase">C:\xxxxx\indexes</prop>

        </props>
    </property>
</bean> 

现在您必须使用org.hibernate.Session来识别您的租户,以执行对特定租户的搜索,如下所示:

EntityManager manager = managerFactory.createEntityManager();

SessionImpl i = (SessionImpl) manager.getDelegate();
SessionFactory session = i.getSessionFactory();

Session s = session.withOptions().tenantIdentifier(xxxxx).openSession();

FullTextSession fullTextSession = org.hibernate.search.Search.getFullTextSession(s);
return fullTextSession; 

这样每次搜索都会使用您提供的特定租户,但对我来说似乎还有另一个问题就是如何获得租户,在我的情况下,我使用网址来识别租户,如果你有的话用户选择te tenant使用,在必要时使用静态变量获取该信息。