在Seam中,从EntityHome注入的EntityManager和getEntityManager之间的区别是什么

时间:2010-03-08 13:56:48

标签: java jpa seam

我正在使用针测试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的持久方法也会调用getEntityManager。这意味着很多模拟或以某种方式重写代码。是否有任何解决方法,为什么抛出此异常?我顺便使用Seam 2.2.0 GA。

组件没有什么特别之处。它们是由seam-gen生成的。测试在内存数据库中执行 - 我按照http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0/db-util.html中的示例进行了操作。

1 个答案:

答案 0 :(得分:4)

  

在Seam中,从EntityHome 注入的EntityManager和getEntityManager之间有什么区别

没有人。

当使用来自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通过@Intrjected组件字段名称执行查找。例如:

@In
EntityManager entityManager;

因为EntityManager字段名称是 entityManager ,Seam将使用此名称执行分层搜索;

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

的问候,