我有一个会话bean类,它有一些数据库操作。我需要使用具有多个数据库的类,因此我配置ejb-jar.xml以从该类创建会话bean,每个数据库的每个bean。这是代码。
public class UserEM
{
/** The entity manager */
@Resource(name="userEntityManager/em")
private EntityManager em;
public EntityManager getEntityManager()
{
return this.em;
}
... Database operations using the `em` ...
}
这是ejb-jar.xml
...
<enterprise-beans>
<session>
<ejb-name>UserEM1</ejb-name>
<ejb-class>com.abc.app.dao.UserEM</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name>
<persistence-unit-name>DataSource1</persistence-unit-name>
</persistence-context-ref>
</session>
<session>
<ejb-name>UserEM2</ejb-name>
<ejb-class>com.abc.app.dao.UserEM</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name>
<persistence-unit-name>DataSource1</persistence-unit-name>
</persistence-context-ref>
</session>
</enterprise-beans>
</ejb-jar>
...
当我只创建一个会话bean时,它按预期工作。但我创建了两个以上,它会在部署时抛出异常:
Caused by: java.lang.IllegalArgumentException: JBAS011053: Incompatible conflicting binding at java:comp/env/userEntityManager/em source: org.jboss.as.jpa.injectors.PersistenceContextInjectionSource@937b07ef
at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.addJndiBinding(ModuleJndiBindingProcessor.java:237)
at org.jboss.as.ee.component.deployers.ModuleJndiBindingProcessor.deploy(ModuleJndiBindingProcessor.java:136)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
这里发生了什么。有人可以帮忙吗?任何建议或意见都是适当的。
纳瓦
答案 0 :(得分:1)
玩了一会儿之后我找到了解决方案。这是代码。
这是ejb-jar.xml
...
<enterprise-beans>
<session>
<ejb-name>UserEM1</ejb-name>
<ejb-class>com.abc.app.dao.UserEM</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>userEntityManager/em1</persistence-context-ref-name>
<persistence-unit-name>DataSource1</persistence-unit-name>
</persistence-context-ref>
</session>
<session>
<ejb-name>UserEM2</ejb-name>
<ejb-class>com.abc.app.dao.UserEM</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>userEntityManager/em2</persistence-context-ref-name>
<persistence-unit-name>DataSource2</persistence-unit-name>
</persistence-context-ref>
</session>
</enterprise-beans>
</ejb-jar>
...
我不知道的是,我们不仅在这里声明了两个EJB,而且我们还声明了两个持久化上下文引用名称,它们必须在应用程序中是唯一的。另一个词'persistence-context-ref-name'中的值也必须是唯一的。完成此操作后,应用程序可以部署,并使用不同的数据源创建两个会话bean。可以使用JNDI查找bean。
干杯,
答案 1 :(得分:0)
尝试将@Resource更改为@PersistenceContext:
@PersistenceContext(name="userEntityManager/em")
private EntityManager em;
<强>更新强> 通过ejb-jar.xml注入怎么办?在没有注释的情况下定义EntityManager em并将以下内容添加到xml:
<session>
<ejb-name>UserEM1</ejb-name>
<ejb-class>com.abc.app.dao.UserEM</ejb-class>
<session-type>Stateless</session-type>
<persistence-context-ref>
<persistence-context-ref-name>userEntityManager/em</persistence-context-ref-name>
<persistence-unit-name>DataSource1</persistence-unit-name>
<injection-target>
<injection-target-class>com.abc.app.dao.UserEM</injection-target-class>
<injection-target-name>em</injection-target-name>
</injection-target>
</persistence-context-ref>
</session>
<session>
...
</session>
我还注意到你有两个enterprise-beans元素。仅定义一个并定义具有该元素内的会话元素的会话bean。