проблема с JPA EntityManager - PullRequest
       45

проблема с JPA EntityManager

1 голос
/ 20 июля 2011

Я новичок в 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) так как я могу решить свои проблемы? заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 августа 2012

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

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

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

  2. Разместите полную трассировку стека.

...