我对JPA和JTA的Jboss WildFly9生气了。 在我的项目需求中,我必须实现多租户,所以我必须在persistence.xml中动态更改数据源。JBoss WildFly上的JPA 2.1和JTA的动态数据源
使用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。因此,我希望我可以用这样的一些代码:
java.lang.NullPointerException at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus()
告诉我是不能参加交易:
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();
当然这个代码不会在所有的休眠上升异常工作在创建实体经理时刻。
那么......我该如何尊重我的项目需求......用我的动态datasouce创建自己的持久性并同时使用事务管理器?
你觉得有可能你下发展使用JavaSE的实体管理器创建写什么呢?我的意思是Persistence.createEntityManagerFactory(“名称”,属性)?这是因为在属性中我可以在运行时插入我的数据源。最重要的是,我可以将此实体管理器附加到UserTransaction JTA? – Alex
使用javase,你不需要经历这样复杂的场景,因为你将不得不手动管理交易。我在这个答案中的建议是,如果你仍然希望容器管理你的交易。 – maress
我在寻找一个可行的解决方案... javase允许我动态设置数据源。我可以构建一个自定义实体管理器对象,并通过hk2 cdi框架注入它...最后一步是处理事务,如果我可以使用jta事务管理器将会很好...没有办法使这成为可能吗? – Alex