无法刷新非托管对象 - 但它是托管的(?)

时间:2017-11-01 12:29:20

标签: java mysql jpa eclipselink

我有一个mysql表,其日期列默认设置时间戳;我插入一个带有以下函数的新行,它可以工作(我看到数据库中的数据,包括时间戳),但它没有显示在后续查询中,所以我试图得到em.refresh()刷新缓存,但失败并出现异常:

public String createItems(Items item){
    String msg="";

    logger.info("OFFICE ItemsSession.createItems 1 id:"+item.getId());
    try{
        if (item.getId()!=null){
            logger.info("OFFICE ItemsSession.createItems 2");
            em.merge(item);
            logger.info("OFFICE ItemsSession.createItems 3");
            Items itm=em.find(item.getClass(), item.getId());
            logger.info("OFFICE ItemsSession.createItems 3a "+itm.getId()+", "+itm.getName()+", "+itm.getCreated());
        }
        else{
            logger.info("OFFICE ItemsSession.createItems 4");
            em.persist(item);
            logger.info("OFFICE ItemsSession.createItems 5");
        }
        em.refresh(item);
        logger.info("OFFICE ItemsSession.createItems 6");
        em.flush();
        logger.info("OFFICE ItemsSession.createItems 7");
    }
    catch (PersistenceException e){
        msg=e.getMessage();
        logger.info("OFFICE ItemsSession.createItems 8 msg: "+msg);           
    }
    logger.info("OFFICE ItemsSession.createItems 9");
    return msg;
}

通过跟踪日志输出,我可以看到它是对em.refresh()的调用:

[2017-11-01T12:27:05.994+0000] [glassfish 5.0] [INFO] [] [docdb.ItemsSession] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225994] [levelValue: 800] [[
  OFFICE ItemsSession.createItems 1 id:3]]

[2017-11-01T12:27:05.994+0000] [glassfish 5.0] [INFO] [] [docdb.ItemsSession] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225994] [levelValue: 800] [[
  OFFICE ItemsSession.createItems 2]]

[2017-11-01T12:27:05.995+0000] [glassfish 5.0] [FINE] [] [org.eclipse.persistence.session./file:/root/projects/office/build/web/WEB-INF/classes/_officePU.sql] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225995] [levelValue: 500] [[
  SELECT id, changed, created, descr, doc, name, doctype, item_id FROM office_db.documents WHERE (item_id = ?)
        bind => [3]]]

[2017-11-01T12:27:05.997+0000] [glassfish 5.0] [FINE] [] [org.eclipse.persistence.session./file:/root/projects/office/build/web/WEB-INF/classes/_officePU.sql] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225997] [levelValue: 500] [[
  SELECT svalue, attribute_id, item_id, ivalue FROM item_attributes WHERE (item_id = ?)
        bind => [3]]]

[2017-11-01T12:27:05.998+0000] [glassfish 5.0] [INFO] [] [docdb.ItemsSession] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225998] [levelValue: 800] [[
  OFFICE ItemsSession.createItems 3]]

[2017-11-01T12:27:05.998+0000] [glassfish 5.0] [INFO] [] [docdb.ItemsSession] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539225998] [levelValue: 800] [[
  OFFICE ItemsSession.createItems 6]]

[2017-11-01T12:27:06.005+0000] [glassfish 5.0] [FINE] [] [org.eclipse.persistence.session./file:/root/projects/office/build/web/WEB-INF/classes/_officePU.sql] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539226005] [levelValue: 500] [[
  UPDATE office_db.items SET created = ?, name = ? WHERE (id = ?)
        bind => [null, Case 3, 3]]]

[2017-11-01T12:27:06.246+0000] [glassfish 5.0] [INFO] [] [docdb.ItemsSession] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539226246] [levelValue: 800] [[
  OFFICE ItemsSession.createItems 7 3, Case 3, null]]

[2017-11-01T12:27:06.559+0000] [glassfish 5.0] [WARNING] [AS-EJB-00056] [javax.enterprise.ejb.container] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539226559] [levelValue: 900] [[
  A system exception occurred during an invocation on EJB ItemsSession, method: public java.lang.String docdb.ItemsSession.createItems(docdb.Items)]]

[2017-11-01T12:27:06.559+0000] [glassfish 5.0] [WARNING] [] [javax.enterprise.ejb.container] [tid: _ThreadID=30 _ThreadName=http-listener-1(3)] [timeMillis: 1509539226559] [levelValue: 900] [[

javax.ejb.EJBException
...
Caused by: java.lang.IllegalArgumentException: Cannot refresh unmanaged object: docdb.Items[ id=3 ].
...

但为什么呢?据我所知,item已经明确管理,我已经检查过ID没有改变,或者我错过了什么?

0 个答案:

没有答案