2015-09-27 48 views
1

我对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创建自己的持久性并同时使用事务管理器?

回答

1

Hibernate有自己的解决方案multi-tenancy。这不是JPA标准的一部分,但它与其兼容并基本上是正交的。

它可以与托管持久性单元一起使用,并与JTA兼容。

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

你只需要实现两个辅助类并在你的persistence.xml中配置它们。

0

如果您可以事先告诉您需要多少数据源,那么您可以通过使用CDI生产者模式来实现某种类型的实体管理器的上下文选择。

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

创建一个生产者方法,根据您当前的上下文选择正确的实体管理器。

在EJB或CDI豆

然后通过CDI注入

@Inject 私人EntityManager的EM获得EntityManager实例

+0

你觉得有可能你下发展使用JavaSE的实体管理器创建写什么呢?我的意思是Persistence.createEntityManagerFactory(“名称”,属性)?这是因为在属性中我可以在运行时插入我的数据源。最重要的是,我可以将此实体管理器附加到UserTransaction JTA? – Alex

+0

使用javase,你不需要经历这样复杂的场景,因为你将不得不手动管理交易。我在这个答案中的建议是,如果你仍然希望容器管理你的交易。 – maress

+0

我在寻找一个可行的解决方案... javase允许我动态设置数据源。我可以构建一个自定义实体管理器对象,并通过hk2 cdi框架注入它...最后一步是处理事务,如果我可以使用jta事务管理器将会很好...没有办法使这成为可能吗? – Alex