我的要求是每个租户的每个索引,我已经将hibernate配置为MultiTenant,我需要将每个租户的数据库索引到不同的索引。我已经看过dynamicSharding Strategy ..但是要求是动态的。它可以有n个分片,而不是关于每个租户存在的任何预先信息。甚至我的索引器应该以这样的方式工作。每当它发现hibernate请求获取索引时,它应首先索引该租户,然后搜索它。
我怎么做.. ??
任何人都可以给我一些例子。 请不要给hibernate doc链接...甚至是用于hibernate搜索的Jboss doc链接。
答案 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使用,在必要时使用静态变量获取该信息。