hibernate错误

来源:互联网 发布:python抓取微信朋友圈 编辑:程序博客网 时间:2024/06/08 13:09

在struts2的action里查出一个question实体的集合,在对questions遍历操作时,要往每个对象里set修改后的属性时,报如下错误:


ERROR - Application attempted to edit read only item: com.center.question.model.Question#999

java.lang.UnsupportedOperationException: Can't write to a readonly object
at org.hibernate.cache.ReadOnlyCache.lock(ReadOnlyCache.java:68)
at org.hibernate.cache.impl.bridge.EntityAccessStrategyAdapter.lockItem(EntityAccessStrategyAdapter.java:72)
at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:108)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:168)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)


at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1028)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:366)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)

at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)

经查看是question.xml里加了<cache usage="read-only"/> 所导致的,由于数据不让修改而查看Dao里的Session,所用的是当前Session,而没有关闭

Session session  = getHibernateTemplate().getSessionFactory().getCurrentSession();

所以在service 里手动创建Session,脱离spring,事务的管理

public List<Question> getQuestionBySectionId(Integer sectionId) {
String hql = "from Question q where q.sectionId=" + sectionId + " order by q.sort";
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
List<Question> list = session.createQuery(hql).list();
session.close();
return list;
}

这样在不改变实体配置文件 的情况下,在action里就可以对集合中的实体进行set操作了

0 0