Проблема с менеджером сущностей поиска jboss

У меня есть мой ушной проект, развернутый в jboss 5.1GA.

С веб-приложением у меня нет проблем, поиск моего 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

моя настойчивость.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...

Где моя ошибка?


person Stefano    schedule 05.03.2010    source источник


Ответы (2)


EntityManager на стороне сервера не может быть сериализован, чтобы его можно было использовать в качестве EntityManager на стороне клиента. Это будет означать, что EntityManager, на который ссылается клиентская сторона, по-прежнему может взаимодействовать с базой данных, использовать пул соединений и т. д. Это невозможно (подумайте, например, о брандмауэре, который защищает сервер базы данных).

Если вам нужно протестировать JPA, используйте локальный EntityManager без транзакций JTA. Если вы хотите протестировать EJB, вам нужно смоделировать весь контейнер EJB. Вы можете использовать встроенный контейнер Spring Pitchfork или Glassfish 3 (последний вариант проще).

person Piotr Kochański    schedule 05.03.2010

Мне нужно протестировать JPA, использовать локальный EntityManager без транзакций JTA!

Я последовал вашему предложению: я создал новый файл 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 с типом модуля сохранения = "RESOURCE_LOCAL" в src/test/resources.

и я поместил файл persistence.xml с параметром persistence-unit type="JTA" в src/main/resources.

Таким образом, у меня есть две отдельные среды. Один для теста и один для производства.

это лучшая практика?

person Stefano    schedule 08.03.2010