【问题标题】:problem with JPA EntityManagerJPA EntityManager 的问题
【发布时间】:2011-10-09 10:24:21
【问题描述】:

我是 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) 那么我该如何解决我的问题呢? 提前致谢

【问题讨论】:

    标签: jpa-2.0 eclipselink entitymanager


    【解决方案1】:
    1. 您必须提交 EntityManager 的事务才能使更改持久化 (试试manager.getTransaction().commit()

    2. 发布完整的堆栈跟踪。

    【讨论】:

      【解决方案2】:

      eclipselink 的默认行为似乎是插入查询仅在选择查询之前、当您调用 flush() 或在事务结束时完成(提交时自动刷新)

      存在具有不同行为的持久性提供程序(例如休眠)。但在您的情况下,请尝试调用 em.flush() 或关闭事务(或确保您的容器正确执行此操作)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 2011-01-22
        • 2012-04-18
        • 1970-01-01
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多