编程语言
首页 > 编程语言> > java-在Seam中,从EntityHome注入的EntityManager和getEntityManager有什么区别

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将使用该名称执行分层搜索;

Herehere可以看到如何设置Seam Managed Persistence上下文.

问候,

标签:jpa,java,seam
来源: https://codeday.me/bug/20191106/2000970.html