2010-03-05 31 views
0

我有我的ear-project部署在jboss 5.1GA。关于jboss查找entitymanager的问题

从webapp我没有问题,查找我的ejb3工作正常!

ES:

ShoppingCart sc= (ShoppingCart) 
(new InitialContext()).lookup("idelivery-ear-1.0/ShoppingCartBean/remote"); 

也是我的EntityManager做工精细iniection!

@PersistenceContext 
private EntityManager manager; 

从测试环境(我使用Eclipse)查找相同的ejb3工作正常! 但entitymanager或PersistenceContext查找不起作用!

我的好测试用例:

public void testClient() { 

    Properties properties = new Properties(); 
    properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); 
    properties.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); 
    properties.put("java.naming.provider.url","localhost"); 

    Context context; 
    try{ 
    context = new InitialContext(properties); 
    ShoppingCart cart = (ShoppingCart) context.lookup("idelivery-ear-1.0/ShoppingCartBean/remote"); // WORK FINE 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

我的坏测试:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("idelivery"); 
    EntityManager em = emf.createEntityManager(); //test1 


    EntityManager em6 = (EntityManager) new InitialContext().lookup("java:comp/env/persistence/idelivery"); //test2 


    PersistenceContext em3 = (PersistenceContext)(new InitialContext()).lookup("idelivery/remote"); //test3 

我的persistence.xml

<persistence-unit name="idelivery" transaction-type="JTA"> 
    <jta-data-source>java:ideliveryDS</jta-data-source> 
    <properties> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop" /><!--validate | update | create | create-drop--> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="true" /> 
    </properties> 
</persistence-unit> 

我的数据源:

<datasources> 
    <local-tx-datasource> 
     <jndi-name>ideliveryDS</jndi-name> 
        ... 
    </local-tx-datasource> 
    </datasources> 

我需要EntityManager和PersistenceContext在构建ejb之前测试我的查询...

我的错误在哪里?

回答

0

服务器端EntityManager不能被序列化,以便您可以将其用作客户端EntityManager。这意味着在客户端引用的EntityManager仍然可以与数据库交谈,使用连接池等。这是不可能的(例如,考虑防火墙,它可以保护数据库服务器)。

如果您需要测试JPA,请使用没有JTA事务的本地EntityManager。如果你想测试EJB,你需要模拟整个EJB容器。您可以使用Spring Pitchfork或Glassfish 3嵌入式容器(后者更容易)。

+0

谢谢!我现在会尝试。 – Stefano

0

我需要测试JPA,使用没有JTA事务的本地EntityManager!

我也跟着你的建议:我创建了新的persistence.xml一个新的持久性单元

<persistence-unit name="ideliveryTest" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>it.idelivery.model.Category</class> 
    <class>it.idelivery.model.User</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/application"/> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
     <property name="hibernate.hbm2ddl.auto" value="create-drop"/> 
     <property name="hibernate.connection.username" value="root"/> 
     <property name="hibernate.connection.password" value=""/> 
    </properties> 
</persistence-unit> 

,并在我的测试案例:

try { 
     logger.info("Building JPA EntityManager for unit tests"); 
     emFactory = Persistence.createEntityManagerFactory("ideliveryTest"); 
     em = emFactory.createEntityManager(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
     fail("Exception during JPA EntityManager instanciation."); 
    } 

做工精细!

在我的Maven项目我把persistence.xml中与SRC /测试/资源持久单元类型=“RESOURCE_LOCAL”

和我把具有持久性单元类型=“JTA”的persistence.xml中的src /主要/资源

通过这种方式我有两个分隔环境。一个用于测试,一个用于生产。

这是最佳做法?