0

jboss 5.1GA に私の ear プロジェクトをデプロイしました。

webapp から問題はありません。私の ejb3 のルックアップは正常に動作します。

エス:

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>

ejb をビルドする前にクエリをテストするには、EntityManager と PersistenceContext が必要です...

私の間違いはどこですか?

4

2 に答える 2

0

JPA をテストする必要があり、JTA トランザクションなしでローカルの EntityManager を使用します。

私はあなたの提案に従いました:私は新しいpersistence-unitで新しい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-unit type="RESOURCE_LOCAL"を指定してpersistence.xmlを配置しました

そして、src/main/resources に persistence-unit type="JTA" を指定して persistence.xml を配置します。

このようにして、私は2つの別々の環境を持っています。1 つはテスト用、もう 1 つは本番用です。

それはベストプラクティスですか?

于 2010-03-08T09:38:32.043 に答える
0

サーバー側の EntityManager はシリアル化できないため、クライアント側の EntityManager として使用できます。これは、クライアント側で参照される EntityManager がデータベースと通信したり、接続プールを使用したりできることを意味します。これは不可能です (たとえば、データベース サーバーを保護するファイアウォールを考えてみてください)。

JPA をテストする必要がある場合は、JTA トランザクションなしでローカルの EntityManager を使用します。EJB をテストする場合は、EJB コンテナー全体をシミュレートする必要があります。Spring Pitchfork または Glassfish 3 組み込みコンテナーを使用できます (後者のオプションの方が簡単です)。

于 2010-03-05T20:23:35.970 に答える