Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
JBoss WildFly上带有JPA2.1和JTA的动态数据源_Jpa_Jboss_Wildfly_Multi Tenant_Jta - Fatal编程技术网

JBoss WildFly上带有JPA2.1和JTA的动态数据源

JBoss WildFly上带有JPA2.1和JTA的动态数据源,jpa,jboss,wildfly,multi-tenant,jta,Jpa,Jboss,Wildfly,Multi Tenant,Jta,我对Jboss WildFly9和JPA和JTA很生气。 在我的项目需求中,我必须实现多租户,因此我必须在persistence.xml中动态更改数据源 使用jee方法这是不可能的,因此有人建议我使用经典: EntityManagerFactory emf = Persistence.createEntityManagerFactory("idelivery"); EntityManager em = emf.createEntityManager(); 因此,到目前为止,它仍在工作,我可以

我对Jboss WildFly9和JPA和JTA很生气。 在我的项目需求中,我必须实现多租户,因此我必须在persistence.xml中动态更改数据源

使用jee方法这是不可能的,因此有人建议我使用经典:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("idelivery"); 
EntityManager em = emf.createEntityManager();
因此,到目前为止,它仍在工作,我可以自己创建enetitymanager,并可以在hashmap(包括数据源)中设置jpa属性

现在我想至少使用JTA来使用事务管理器处理事务

以下是我通过代码设置的属性:

Properties properties = new Properties(); 
properties.put ("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
properties.put("javax.persistence.provider", "org.hibernate.jpa.HibernatePersistenceProvider"); 
properties.put("javax.persistence.transactionType", "JTA");
properties.put("javax.persistence.jtaDataSource", dataSourcePath); 
事务类型现在是JTA。所以我希望我可以使用一些代码,比如:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("idelivery"); 
EntityManager em = emf.createEntityManager();
MyEntity exUser= new MyEntity();
try{
Context context = new InitialContext();
UserTransaction userTransaction = (UserTransaction)context.lookup("java:comp/UserTransaction");
userTransaction.begin();
em.persist(exUser);
userTransaction.commit();
当然,这段代码根本不起作用,因为Hibernate引发了一个异常:

java.lang.NullPointerException at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus()
告诉我在创建实体管理器时无法加入事务


所以。。。我如何尊重我的项目要求。。。使用dynamic datasouce创建自己的持久性,同时使用事务管理器?

Hibernate有自己的解决方案。这不是JPA标准的一部分,但它与JPA标准兼容,并且在很大程度上与JPA标准正交

它与托管持久性单元一起工作,并且与JTA兼容

我已经在WildFly 8.2.0.Final和9.0.1.Final上成功地使用了模式策略


您只需要实现两个helper类,并在
persistence.xml

中对它们进行配置,如果您可以事先知道需要多少数据源,那么您就可以使用CDI生产者模式实现实体管理器的某种上下文选择

在persistence.xml中定义所有可能的数据源,然后使用某种生产者单例工厂类根据持久性单元注入它们

创建一个producer方法,该方法根据当前上下文选择正确的实体管理器

然后在ejb或CDIBeans中,通过cdi注入获得entitymanager的实例

@注入
private EntityManager em

您认为可以使用javaSE实体管理器创建来开发您编写的内容吗?我是说Persistence.createEntityManagerFactory(“名称”,属性)?这是因为在属性中,我可以在运行时插入数据源。最重要的是,我可以将这个实体管理器附加到UserTransaction JTA吗?使用javase,您不需要经历如此复杂的场景,因为您无论如何都必须手动管理事务。我在这个答案中的建议是,如果您仍然希望容器管理您的事务。我正在寻找一个可行的解决方案。。。javase允许我动态设置数据源。我可以构建一个自定义实体管理器对象,并通过hk2 cdi框架注入它。。。最后一步是处理事务,如果我能使用jta事务管理器就好了。。。没有办法做到这一点?可以肯定的是,您仍然必须执行bean管理的事务。因此,您只需使用
UserTransaction的begin、commit和rollback