проблема с JPA EntityManager

Я новичок в JPA, у меня проблема с JPA. Я использовал диспетчер сущностей следующим образом:

1: package com.icesoft.icefaces.samples.datatable.jpa;
    2:
    3: import java.util.logging.Level;
    4: import java.util.logging.Logger;
    5:
    6: import javax.persistence.EntityManager;
    7: import javax.persistence.EntityManagerFactory;
    8: import javax.persistence.Persistence;
    9: import javax.persistence.Query;
   10: /**
   11:  * @author MyEclipse Persistence Tools
   12:  */
   13: public class EntityManagerHelper {
   14:
   15:     private static final EntityManagerFactory emf;
   16:     private static final ThreadLocal<EntityManager> threadLocal;
   17:     private static final Logger logger;
   18:
   19:     static {
   20:         emf = Persistence.createEntityManagerFactory("tutorialPU");
   21:         threadLocal = new ThreadLocal<EntityManager>();
   22:         logger = Logger.getLogger("tutorialPU");
   23:         logger.setLevel(Level.ALL);
   24:     }
   25:
   26:     public static EntityManager getEntityManager() {
   27:         EntityManager manager = threadLocal.get();
   28:         if (manager == null || !manager.isOpen()) {
   29:             manager = emf.createEntityManager();
   30:             threadLocal.set(manager);
   31:         }
   32:         return manager;
   33:     }
   34:
   35:      public static void closeEntityManager() {
   36:         EntityManager em = threadLocal.get();
   37:         threadLocal.set(null);
   38:         if (em != null) em.close();
   39:     }
   40:
   41:     public static void beginTransaction() {
   42:         getEntityManager().getTransaction().begin();
   43:     }
   44:
   45:     public static void commit() {
   46:         getEntityManager().getTransaction().commit();
   47:     }
   48:
   49:     public static Query createQuery(String query) {
   50:         return getEntityManager().createQuery(query);
   51:     }
   52:
   53:     public static void log(String info, Level level, Throwable ex) {
   54:         logger.log(level, info, ex);
   55:     }
   56:
   57: }

мой файл persistence.xml:

    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">

      <persistence-unit name="OrderEJB" type="JTA">
        <jta-data-source>movieDatabase</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
      </persistence-unit>
    </persistence>

у меня две проблемы: 1-когда я вызываю getEntityManager().persist(anObject); он ничего не сохраняет в базе данных и не выдает никаких ошибок в журнале контейнера! 2-все выглядит нормально, но когда я повторно развертываю приложение (без перезапуска сервера), все операции JPA терпят неудачу со следующим исключением:

java.lang.IllegalArgumentException: The type [null] is not the expected
[EntityType] for the key class [class entity.MyClass].

если я перезапущу сервер все в порядке!!!

я использую netbeans 6.9.1, glasfish 3.1, eclipselink (JPA 2.0), так как я могу решить свои проблемы? заранее спасибо


person arash    schedule 20.07.2011    source источник


Ответы (2)


arrow_upward
0
arrow_downward

  1. вам нужно зафиксировать транзакцию EntityManager, чтобы изменения были постоянными (попробуйте manager.getTransaction().commit())

  2. Выложите полную трассировку стека.

person MRalwasser    schedule 25.07.2011

arrow_upward
0
arrow_downward

Поведение eclipselink по умолчанию, по-видимому, заключается в том, что запросы на вставку выполняются только перед запросами на выбор, когда вы вызываете flush() или в конце транзакции (автоматическая сброс при фиксации)

есть провайдеры постоянства с другим поведением (например, спящий режим). но в вашем случае попробуйте вызвать em.flush() или закрыть транзакцию (или убедитесь, что ваш контейнер делает это правильно)

person Laures    schedule 23.08.2012