سؤال

لديّ مشروع الأذن الخاص بي في JBOSS 5.1GA.

من WebApp ليس لدي مشكلة ، يبحث عن EJB3 يعمل بشكل جيد!

ES:

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

أيضا عدم وجود كيانتي.

@PersistenceContext
private EntityManager manager;

من اختبار Enviroment (يمكنني استخدام Eclipse) البحث عن نفس EJB3 يعمل بشكل جيد! لكن البحث عن intityManager أو persistenceContxt لا تعمل !!!

حالة الاختبار الجيدة:

 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

بلدي المثابرة. 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 ...

أين خطأي؟

هل كانت مفيدة؟

المحلول

لا يمكن تسلسل EntityManager من جانب الخادم بحيث يمكنك استخدامه كصاحب من جانب العميل. هذا يعني أن EntityManager المشار إليه على جانب العميل لا يزال بإمكانه التحدث إلى قاعدة البيانات ، واستخدام مجموعة الاتصال ، وما إلى ذلك. إنه مستحيل (فكر في جدار الحماية ، الذي يحمي خادم قاعدة البيانات ، على سبيل المثال).

إذا كنت بحاجة إلى اختبار JPA ، فاستخدم ContityManager المحلي بدون معاملات JTA. إذا كنت ترغب في اختبار EJBS ، فأنت بحاجة إلى محاكاة حاوية EJB بالكامل. يمكنك استخدام حاوية Spring Pitchfork أو Glassfish 3 المدمجة (الخيار الأخير أسهل).

نصائح أخرى

أحتاج إلى اختبار JPA ، واستخدام EntityManager المحلي بدون معاملات JTA!

تابعت اقتراحك: لقد خلقت ثباتًا جديدًا

<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 الخاص بي ، وضعت المثابرة

وأضع المثابرة.

بهذه الطريقة لدي اثنان يفصل بين البيئة. واحد للاختبار وواحد للإنتاج.

إنها أفضل ممارسة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top