我将我的耳朵项目部署在jboss 5.1GA中。
从webapp我没有问题,查找我的ejb3工作正常!
ES:
ShoppingCart sc= (ShoppingCart)
(new InitialContext()).lookup("idelivery-ear-1.0/ShoppingCartBean/remote");
我的EntityManager的工作也很好!
@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 :(得分:0)
无法序列化服务器端EntityManager,因此您可以将其用作客户端EntityManager。这意味着在客户端引用的EntityManager仍然可以与数据库通信,使用连接池等。这是不可能的(例如,考虑防火墙,它保护数据库服务器)。
如果需要测试JPA,请使用不带JTA事务的本地EntityManager。如果要测试EJB,则需要模拟整个EJB容器。您可以使用Spring Pitchfork或Glassfish 3嵌入式容器(后一种选择更容易)。
答案 1 :(得分: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项目中,我在src / test / resources中将persistence.xml与persistence-unit type =“RESOURCE_LOCAL”放在一起
我把persistence.xml和persistence-unit type =“JTA”放在src / main / resources中
通过这种方式,我有两个独立的环境。一个用于测试,一个用于生产。这是最佳做法吗?