проблема с 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)


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

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

person MRalwasser    schedule 25.07.2011

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

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

person Laures    schedule 23.08.2012