2011-07-20 3 views
1

Je suis nouveau à JPA, j'ai un problème avec mon JPA. j'ai utilisé le gestionnaire d'entités comme suit:problème avec JPA EntityManager

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: } 

mon persistence.xml est:

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

j'ai deux problèmes. 1 quand je l'appelle getEntityManager() persistent (anObject) ; il ne sauvegarde rien dans la base de données ni ne produit aucune erreur dans le journal du conteneur !! 2-toutes les choses semble ok, mais quand je redploy l'application (sans serveur redémarrer) toutes les opérations de JPA échouent à l'exception suivante:

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

si je redémarre le serveur tout va bien !!! J'utilise netbeans 6.9.1, glasfish 3.1, eclipselink (JPA 2.0) alors comment pourrais-je résoudre mes problèmes? merci à l'avance

Répondre

0
  1. vous devez engager la transaction EntityManager que les changements seront persistants (essayez manager.getTransaction().commit())

  2. Poster le stacktrace complet.

0

Le comportement par défaut de EclipseLink semble que les requêtes d'insertion sont faites seulement avant de sélectionner les requêtes, lorsque vous appelez flush() ou à la fin de la transaction (flush automatique lors de la validation)

il sont des fournisseurs de persistance avec un comportement différent (hibernation par exemple). mais dans votre cas, essayez d'appeler em.flush() ou fermez la transaction (ou assurez-vous que le conteneur le fait correctement)