我有一个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没有改变,或者我错过了什么?