Hibernate查询出的实体都是持久化对象,拿到该对象后,如果你调用了该对象的set方法,那么在事务递交的时候,Hibernate会把你设置的值自动更新到数据库中。
被Hibernate这个机制坑了半天!
现象:页面在第一次展示数据的时候没有问题,但是刷新之后通过条件查询就死活查询不到数据。
通过日志分析,发现在select操作之后,紧跟着一个update操作,在代码里又死活找不到这个更新数据库的操作,代码只是在查询之后对某个属性进行了一个“翻译”的操作。后来经过几番百度之后终于找到这个原因!还是Hibernate用的比较少啊,之前写代码的人估计也没注意这个问题,才导致了现在的BUG!
session.evict(obj):会把指定的缓冲对象进行清除;
解决办法:
在获取实体对象后,调用下session.evict(entity)方法,该方法的作用是把持久化对象变成托管状态。变成托管状态后,Hibernate就不会再去自动更新该实体。
public void getExportExcelJson() throws UnsupportedEncodingException {
Page<ExportRecord> page = null;
List<ExportRecord> dataList = null;
ExportRecordQueryBean qBean = new ExportRecordQueryBean();
ManagerSession managerSession =
ManagerSessionUtils.getManagerSession(getSession());
Manager manger = managerService.queryByAccount(managerSession.getAccount());
qBean.setOperateId(manger.getId());
page = exportRecordService.query(qBean, getCurrentPageNo(), getPageSize());
if (page != null && page.getDataList() != null && page.getDataList().size() > 0)
{
dataList = page.getDataList();
for (ExportRecord exportRecord : dataList) {
exportRecordService.getBaseDao().getSession().evict(exportRecord);// 解决问题
exportRecord.setOperateId(managerSession.getAccount());// 问题所在
}
} else {
dataList = new ArrayList<ExportRecord>();
}
/*** 组装成gridJson格式 ***/
int total = 0;
int records = 0;
JsonConfigEx jsonConfigEx = new JsonConfigEx();
String json = JsonUtils.collection2Json(dataList, jsonConfigEx);
total = page.getTotalPageCount();
records = page.getTotalDataCount();
String girdJson = JqGridUtils.toGridJson(total, records, json);
print(girdJson);
}