Проблема с поиском сущностей в jboss - PullRequest
0 голосов
/ 05 марта 2010

Мой проект ear развернут в jboss 5.1GA.

Из веб-приложения у меня нет проблем, поиск моего ejb3 работает отлично!

эс:

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

my 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 ...

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

Ответы [ 2 ]

0 голосов
/ 08 марта 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 с типом единицы постоянства type = "JTA" в src / main / resources

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

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

0 голосов
/ 05 марта 2010

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

...