HIBERNATE报错!

沉默的飞鱼 2011-01-20 10:46:04
SERVICE================================
public List<DBHtml> save(List<DBHtml> lists) {
List<DBHtml> lis=new ArrayList<DBHtml>();
for(DBHtml onehtml:lists){
DBHtml oldhtml=new DBHtml();
oldhtml=htmlDao.findByID(onehtml.getId());
oldhtml.setTitle(onehtml.getTitle());
oldhtml.setUrl(onehtml.getUrl());
lis.add(oldhtml);
onehtml=null;
oldhtml=null;
}
return htmlDao.save(lis);
}
DAOIMPL================================================

public List<DBHtml> save(List<DBHtml> lists) {
this.getHibernateTemplate().saveOrUpdateAll(lists);
System.out.println("===============================");
return lists;
}
错误

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.fs.po.DBHtml#4]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.fs.po.DBHtml#4]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:661)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdateAll(HibernateTemplate.java:764)

求高手解决!
...全文
132 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfm613625 2011-01-20
  • 打赏
  • 举报
回复
错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

  解决方法一:session.clean()

  PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

  解决方法二:session.refresh(object)

  PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判断一下。

  解决方法三:session.merge(object)

  PS:Hibernate里面自带的方法,推荐使用。

2、Found two representations of same collection

  错误原因:见1。

  解决方法:session.merge(object)

天空win 2011-01-20
  • 打赏
  • 举报
回复
不同的对象,出现了相同的Id.而Hibernate中是以Id来标识对象的。
zn85600301 2011-01-20
  • 打赏
  • 举报
回复
oldhtml=htmlDao.findByID(onehtml.getId());
这句造成 你产生的对象的ID会重复
你可以再之后 将oldhtml.setId(null);
Epiphone 2011-01-20
  • 打赏
  • 举报
回复

public List<DBHtml> save(List<DBHtml> lists) {
List<DBHtml> lis=new ArrayList<DBHtml>();
DBHtml oldhtml = null;
for(DBHtml onehtml:lists){
oldhtml=new DBHtml();
oldhtml=htmlDao.findByID(onehtml.getId());
oldhtml.setTitle(onehtml.getTitle());
oldhtml.setUrl(onehtml.getUrl());
lis.add(oldhtml);
onehtml=null;
oldhtml=null;
}
return htmlDao.save(lis);
}

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧