Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以编程方式指定JPA(特别是hibernate)的数据源名称,以用于Wildfly中的每个请求的数据库连接_Hibernate_Datasource_Wildfly_Multi Tenant - Fatal编程技术网

以编程方式指定JPA(特别是hibernate)的数据源名称,以用于Wildfly中的每个请求的数据库连接

以编程方式指定JPA(特别是hibernate)的数据源名称,以用于Wildfly中的每个请求的数据库连接,hibernate,datasource,wildfly,multi-tenant,Hibernate,Datasource,Wildfly,Multi Tenant,我有一个运行在JBoss5中的多终端应用程序。目前,这并没有利用hibernate,但我正试图升级它来实现这一点。除了应用程序根据请求的URL中的子域确定要使用的数据源之外,一切正常。e、 g.对company1.myapp.com/resource/id/1的请求将从JNDI请求DSNjava:/datasources/company1的连接,而对company2.myapp.com/resource/id/1的请求将从JNDI请求DSNjava:/datasources/company2的连

我有一个运行在JBoss5中的多终端应用程序。目前,这并没有利用hibernate,但我正试图升级它来实现这一点。除了应用程序根据请求的URL中的子域确定要使用的数据源之外,一切正常。e、 g.对
company1.myapp.com/resource/id/1
的请求将从JNDI请求DSN
java:/datasources/company1
的连接,而对
company2.myapp.com/resource/id/1
的请求将从JNDI请求DSN
java:/datasources/company2
的连接,每个连接到自己的数据库以防止任何错误可能的数据泄漏

我想对JBoss8(Wildfly)下的hibernate做类似的事情。不幸的是,因为Wildfly正在管理我的
HibernatePersistenceProvider
(我只是注入我的EntityManager,让Wildfly完成所有工作),所以我无法通过编程告诉它使用哪个DSN进行连接

有没有一个我错过的明智的方法?我尝试将提供程序更改为扩展
HibernatePersistenceProvider
的自定义类,但最后出现了一个错误,它找不到我的类。我甚至不相信这会起作用,因为我不能很容易地在这门课上得到请求

基本上,我需要从URL确定DSN,并使用它告诉Hibernate每个请求使用哪个数据源


有什么想法吗?

您可以在persistence.xml中指定不同的持久性单元,每个子域一个。然后,您可以使用cdi提供程序方法根据已查询的域注入适当的EntityManager。
但是,如果设置中的子域数量不固定,此解决方案将不起作用。

是的,我的想法是要实现这一点,您需要根据您的子域维护hibernate配置文件。像

对于
company1.myapp.com
假设我们有如下hibernate配置文件
company1\u Hibenate.cfg.xml

对于
company2.myapp.com
假设我们有如下hibernate配置文件
company2\u Hibenate.cfg.xml

在加载上下文之后,您将构建SessionFactorys

例如:

SessionFactory sessionFactory1 = new  Configuration().configure("company1_Hibenate.cfg.xml").buildSessionFactory();

SessionFactory sessionFactory2 = new Configuration().configure("company2_Hibenate.cfg.xml").buildSessionFactory();

现在在interceptor中,您将检查域并相应地使用sessionFactory。

关于保留多个数据源配置文件和那么多sessionFactory对象,您怎么说?我不确定我是否理解您的问题。我使用的不是SessionFactory,而是EntityManager。。。您是否有使用SessionFactorys的建议?非常抱歉-但您的解决方案不会有帮助,因为代码使用JBoss注入的EntityManager,所以我无法使用SessionFactorys…不幸的是-系统具有动态注册,所以我需要动态地部署数据源,然后让Hibernate/JPA动态地使用它们。。。