让我们考虑一个主数据库和一个表。
我在jboss的deploy目录中创建了一个datasource xml文件,并将ejb项目放入数据源的persistance.xml中。
在我的ejb项目中,我正在使用@PersistenceContext并使用该实体管理器加载这一个表。表中有一些数据源名称(数据源名称是jndi数据源名称?)我之前也在deploy目录中创建过。加载其他数据源名称的bean现在调用其他ejbs并从表中传递一个数据源名称。
此另一个ejb现在应该使用给定的数据源名称而不是persistance.xml内部连接到该数据库。
换句话说:我想在一个ejb中加载数据源名称。然后我想调用其他ejbs,每个ejb应该连接到不同的数据源。
非常感谢, Hauke
答案 0 :(得分:2)
我不太确定你在这之后会发生什么,所以请注意,你正试图做一些疯狂的事情(JPA在运行时不喜欢动态)。
但是,有几个选项:我听到的是你想要改变与数据库的连接。首先,您的持久性XML只是一个起点,您不必包含数据源。这不是最佳实践,因为DataSource和datasourse-ds.xml的想法是确保您可以配置应用程序而无需重新编译代码(以及多个部署等...)。如果您接管管理连接的工作,您可以使用您的实体经理。
我只是想澄清这可能是一个坏主意(你在谈论ORM框架 - 在这种情况下是JPA Hibernate)但是你可以提供自己的实体管理器,而不是使用@PersistenceContext。我强烈建议您使用EclipseLink作为解决方法。它不是嵌入JBoss的,你可以(一旦它运行)从头开始配置它。
http://wiki.eclipse.org/EclipseLink
运行后,您可以主动创建和销毁实体管理器,或者拥有从连接属性创建的众多实体管理器。
这里的长短:我认为你走的路很糟糕,你可能想重新考虑设计。 JPA可能是错误的工具,而且我不想这么说,如果你经常改变连接,那么你使用 javax.sql 可能比使用JPA数据源更好。
无论如何,使用Eclipselink2.X你可以做类似以下的事情 - >
HashMap<String, Object> connectionA new = HashMap<String, Object>();
propsA.put("javax.persistence.jdbc.driver", "driverClass");
propsA.put("javax.persistence.jdbc.url", "connectionString");
. . .
etc...
EntityManager entityManager = Persistence.createEntityManagerFactory("myUnit").
createEntityManager(propsA);
此时,您可以为每个需要的管理器创建一组新属性(使用新连接支持它)。
噩梦?是。容器管理?不 - 你负责处理交易,但它应该有效吗?绝对