对于冗长的问题,我深表歉意。
我正在开发 EJB 应用程序。我有两个 EJB Eclipse 项目(Ejb1
和 Ejb2
)和其他动态 Web 应用程序(Web1
),它们将被编译并添加到父 EjbEar
项目中,并打包为 EjbEar.ear
文件。
问题1:我首先在EJb1
项目的META-INF
文件夹中创建了一个persistence.xml
,这有助于我将entitymanager注入(inject) session bean并开始工作。 (代码如下)
@PersistenceContext(unitName = "ejbPersistanceunit")
private EntityManager em;
在Ejb2
中,我创建了另一个 session bean,并注入(inject)了与上面相同的entitymanager(这里我没有
配置persistence.xml),但是当我从客户端调用时,我得到了来自Ejb1和Ejb2项目的响应。
为什么 EntityManger 在两个 ejb 项目之间共享?如果我的 Ejb2 项目需要另一个 persistence.xml 用于不同的数据源,我是否需要创建另一个 persistence.xml 或者将其包含在现有的 persistence.xml 中?它也会被共享吗?我的 Web1
项目是否也以同样的方式获取 Entitymanager?
问题2:我在Ejb1
项目中有sessionbean,它们的远程接口(interface)是在Web1
项目中创建的,但是在ejb项目中公开这些新创建的实体/接口(interface)的最佳方法是什么? (对于企业应用程序中的多个 Ejb 项目)
问题3: Ejb 3.0 不再具有正确的本地和远程接口(interface)吗?
最佳答案
Why does the EntityManger get shared between two ejbprojects?
如果您不想,可以通过隔离 Ejb jar 来禁用此共享。如果jboss打开jboss-deployment-struct.xml
并将属性ear-subdeployments-isolated
设置为true
If my Ejb2 project needs another persistence.xml for a different data source, do I create another one or have it included in the existing persistence.xml? will it also be shared ?
这完全取决于您的用例, 如果您的系统中有多个数据源,那么我将基于 persistence.xml 定义 我打包访问持久性单元的 Bean 的方式。
如果属于两个数据源的所有实体都打包在一起,那么我将在同一个 persistence.xml
中定义 2 个持久化单元
如果它们以不同的方式包装在 2 个 jar 中,则可能出现以下任何情况
- 如果bean访问由相同服务提供服务的实体
persistenceUnit/Datasource 打包在一起然后我会创建
2 个 persistence.xml 以及 2 个 jar 中关联的
PersistenceUnit
- 如果隔离设置为 false,那么我可以像这样定义我的
persistence.xml
上面或者我会在一个单一的中一起定义 2 个 persistenceUnitpersistence.xml
并确保该 jar 首先部署Persistence.xml
Does my Web1 project also get hold of the Entitymanager in the same way?
是的,您可以访问 persistenceContext
注意:我假设您的应用服务器是 JBoss
I have sessionbeans in Ejb1 project and their remote interfaces are created in Web1 project but what is the best approach in exposing these newly created Entities/Interfaces in an ejb project? (For more than one Ejb project in an Enterprise application)
据我所知,这取决于您的系统架构/设计。如果我是您,我会将远程接口(interface)和 Bean 一起打包在同一个 EJB-Jar 中,并且我会使用业务委托(delegate)来查找 EJB bean,或者当远程接口(interface)在 Web 中可见时,我会在 Web 层中注入(inject)相同的接口(interface)并使用它。
Ejb 3.0 no longer have the home and remote interfaces correct?
没有名为 home 和 remote 的接口(interface),但这个概念仍然以注释 @Remote 和 @Local
的形式存在,这意味着您可以定义接口(interface),并且可以在接口(interface)级别或 Bean 级别声明 @Remote 或 @Local
。
关于java - ejb j2ee 中的持久上下文范围和其他问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27910468/