JBoss WildFly上带有JPA2.1和JTA的动态数据源
我对Jboss WildFly9和JPA和JTA很生气。 在我的项目需求中,我必须实现多租户,因此我必须在persistence.xml中动态更改数据源 使用jee方法这是不可能的,因此有人建议我使用经典: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(); 因此,到目前为止,它仍在工作,我可以
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