java-在Seam中,从EntityHome注入的EntityManager和getEntityManager有什么区别
作者:互联网
我正在使用针测试API测试Seam应用程序.在我的代码中,我使用的是EntityHome中的getEntityManager()方法.当我针对内存数据库运行单元测试时,出现以下异常:
java.lang.IllegalStateException: No application context active
at org.jboss.seam.Component.forName(Component.java:1945)
at org.jboss.seam.Component.getInstance(Component.java:2005)
at org.jboss.seam.Component.getInstance(Component.java:1983)
at org.jboss.seam.Component.getInstance(Component.java:1977)
at org.jboss.seam.Component.getInstance(Component.java:1972)
at org.jboss.seam.framework.Controller.getComponentInstance(Controller.java:272)
at org.jboss.seam.framework.PersistenceController.getPersistenceContext(PersistenceController.java:20)
at org.jboss.seam.framework.EntityHome.getEntityManager(EntityHome.java:177)
etc ..
我可以通过注入EntityManager来解决其中一些错误
@In
EntityManager entityManager;
不幸的是,EntityHome的persist方法也调用了getEntityManager.这意味着很多模拟或以某种方式重写代码.有任何解决方法,为什么仍会引发此异常?我正在使用Seam 2.2.0 GA.
这些组件没有什么特别的.它们是由seam-gen生成的.该测试是在内存数据库中执行的-我遵循http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0/db-util.html中的示例.
解决方法:
In Seam what is the difference between injected EntityManager and getEntityManager from EntityHome ?
没有人.
当使用来自EntityHome的getEntityManager时,Seam将查找一个名为EntityManager的Seam管理的持久化上下文.如果您使用除EntityManager之外的其他名称来设置Seam管理的持久性上下文,则您的EntityHome将引发Excedption.
这是EntityHome中getEntityMananger的默认实现
public EntityManager getEntityManager() {
return (EntityMananger) Component.getInstance("entityManager");
}
而当使用@ In-jected EntityManager时,Seam将按照上面所示进行操作.两者都是相同的Seam托管持久性上下文.
请记住,Seam通过@ In-jected组件字段名称执行查找.例如:
@In
EntityManager entityManager;
因为EntityManager字段名称是entityManager,所以Seam将使用该名称执行分层搜索;
Here和here可以看到如何设置Seam Managed Persistence上下文.
问候,
标签:jpa,java,seam 来源: https://codeday.me/bug/20191106/2000970.html