代码之家  ›  专栏  ›  技术社区  ›  Navi

在seam中,从entityhome注入的entitymanager和getentitymanager有什么区别

  •  3
  • Navi  · 技术社区  · 15 年前

    我正在使用针测试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 . 这意味着大量的模拟或以某种方式重写代码。有什么解决方法吗?为什么会抛出这个异常?顺便说一下,我用的是Seam2.2.0GA。

    这些部件没有什么特别之处。它们是由seam-gen生成的。 http://jbosscc-needle.sourceforge.net/jbosscc-needle/1.0/db-util.html .

    1 回复  |  直到 15 年前
        1
  •  4
  •   Community CDub    8 年前

    有什么区别 在EntityHome中注入的EntityManager和GetEntityManager之间 ?

    没有人。

    在EntityHome中使用getEntityManager时,Seam将查找名为 实体管理器 . 如果设置seam管理的持久性上下文 名称不是EntityManager ,您的整个家庭将抛出一个超额。

    以下是EntityHome中getEntityMananger的默认实现

    public EntityManager getEntityManager() {
        return (EntityMananger) Component.getInstance("entityManager");
    }
    

    当使用@in-jected entitymanager时,seam将执行如上所示的操作。两者都是同一个seam管理的持久化上下文。

    记住seam通过@in-jected component字段名执行查找。例如:

    @In
    EntityManager entityManager;
    

    因为EntityManager字段名是 实体管理器 ,seam将使用此名称执行分层搜索;

    Here here 您可以看到如何设置seam管理的持久性上下文。

    当做,