hibernate批量删除时出现的问题

gimm667 2011-01-26 08:12:30
以下是我的批量删除的代码:
String[] studentIDs = request.getParameterValues("VoteOption1");
Collection entities = new ArrayList();
for (int i = 0; i < studentIDs.length; i++) {
T_student student = t_studentDAO.read(Integer.parseInt(studentIDs[i]));

entities.add(student);
}
t_studentDAO.deleteAll(entities);


以下是进行操作时出现的异常信息:
严重: Servlet.service() for servlet action threw exception
org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions
at org.hibernate.collection.AbstractPersistentCollection.setCurrentSession(AbstractPersistentCollection.java:410)
at org.hibernate.event.def.OnUpdateVisitor.processCollection(OnUpdateVisitor.java:40)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:101)
at org.hibernate.event.def.AbstractVisitor.processValue(AbstractVisitor.java:61)

请大家帮忙看看是哪里的问题,谢谢!
...全文
198 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗然的白天 2011-01-27
  • 打赏
  • 举报
回复
read方法
getSession().flush();
getSession().clear();
getSession().close();
如果用spring了就不要在开session了,这样写不好,还有你那是一个循环查询的,而且每次只查一个,麻烦。
既然你已经得到主键了,写hql吧用IN关键字来查。
zn85600301 2011-01-27
  • 打赏
  • 举报
回复
read方法实现是:
public T read(PK id) {
return (T) getSession().get(type, id);
}

将这个改成
String hql ="from T_student where id ="+id+"";
this.getHibernateTemplate().find(hql);
试试
gimm667 2011-01-27
  • 打赏
  • 举报
回复
沉了么,大家帮帮忙啊
gimm667 2011-01-27
  • 打赏
  • 举报
回复
多谢,结贴散分
暗然的白天 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gimm667 的回复:]
引用 6 楼 chenhao1208 的回复:
read方法
getSession().flush();
getSession().clear();
getSession().close();
如果用spring了就不要在开session了,这样写不好,还有你那是一个循环查询的,而且每次只查一个,麻烦。
既然你已经得到主键了,写hql吧用IN关键字来查。


谢谢,'如果用spr……
[/Quote]
也不能说不好,这个意思。交给spring管理能避免一些忘记链接关闭一些问题
gimm667 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenhao1208 的回复:]
read方法
getSession().flush();
getSession().clear();
getSession().close();
如果用spring了就不要在开session了,这样写不好,还有你那是一个循环查询的,而且每次只查一个,麻烦。
既然你已经得到主键了,写hql吧用IN关键字来查。
[/Quote]

根据chenhao1208的提示,最终的解决办法是这样的
Collection<T_student> entities = t_studentDAO.selectAll(ids);
t_studentDAO.deleteAll(entities);

@Override
public Collection<T_student> selectAll(String[] ids) {
return getSession().createQuery("from T_student where ID in (:ids)").setParameterList("ids", ids).list();

}

@Override
public void deleteAll(Collection<T> entities) {
this.getHibernateTemplate().deleteAll(entities);
}

因为T_student和其它任职表和培训表是有关联关系的,所以要删除必须先查出T_student对象,再删除才能删除T_student对象和对应的关联表信息,因此不能使用#10楼zhangliangming_87的方式

感谢#6楼chenhao1208的指教,分给你了,谢谢


扁鵲東南飛 2011-01-27
  • 打赏
  • 举报
回复
为什么这样写呢?
你先根据 id 来查询到所要删除的 记录。然后把这些记录全部读取了。读取的时候用了打开session对象。

然后把这些对象删除,又打开一个session ,但是此前那个session 还没关闭,根据这个推测的(Illegal attempt to associate a collection with two open sessions)


为什么不直接根据 所得的id,直接删除呢?这样感觉效率还高。 不必要先查询出来然后再去删除了。

String[] studentIDs = request.getParameterValues("VoteOption1");
Collection entities = new ArrayList();
for (int i = 0; i < studentIDs.length; i++) {
//T_student student = t_studentDAO.read(Integer.parseInt(studentIDs[i]));
//entities.add(student);
t_studentDAO.deleteById(Integer.parseInt(studentIDs[i]));
}
deleteById();重新写这个方法。这个方法自己写应该很简单。就是根据id删除记录。

君望永远 2011-01-27
  • 打赏
  • 举报
回复
还是开个事务吧
stupid_ks 2011-01-27
  • 打赏
  • 举报
回复
把你的t_studentDAO中调用到的方法列出来
gimm667 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chenhao1208 的回复:]
read方法
getSession().flush();
getSession().clear();
getSession().close();
如果用spring了就不要在开session了,这样写不好,还有你那是一个循环查询的,而且每次只查一个,麻烦。
既然你已经得到主键了,写hql吧用IN关键字来查。
[/Quote]

谢谢,'如果用spring了就不要在开session了,这样写不好'这句啥意思?
gimm667 2011-01-26
  • 打赏
  • 举报
回复
就是啊
风影萧诺 2011-01-26
  • 打赏
  • 举报
回复
怎么没有高手给解答啊!
gimm667 2011-01-26
  • 打赏
  • 举报
回复
t_studentDAO我写的接口,
read方法实现是:
public T read(PK id) {
return (T) getSession().get(type, id);
}
deleteAll方法实现是:
public void deleteAll(Collection<T> entities) {
this.getHibernateTemplate().deleteAll(entities);
}

感觉应该是session和事务的问题,但不是特别明白,请教下大家,谢谢啦!
内容概要:SSD2828QN4是一款MIPI主桥接芯片,用于连接应用处理器与传统并行LCD接口及支持MIPI从属接口的LCD驱动器。该芯片支持最高每通道1Gbps的串行链路速度,最多可配置4个数据通道,显著减少了信号数量。它支持多种接口模式,包括RGB+SPI组合接口,适用于驱动智能或非智能显示面板,并能通过命令模式和视频模式传输数据。芯片内置钟和复位模块、外部接口、协议控制单元(PCU)、包处理单元(PPU)、错误校正码/循环冗余校验(ECC/CRC)模块、长包和命令缓冲区、D-PHY控制器、模拟收发器以及内部锁相环(PLL),确保了高效的数据传输和系统稳定性。此外,文档详细描述了芯片的引脚分配、寄存器设置、操作模式、电源序列、序特性等关键参数,为开发者提供了全面的技术指导。 适合人群:具备一定硬件设计基础,从事嵌入式系统开发、显示技术研究的研发人员。 使用场景及目标:①实现应用处理器与MIPI兼容显示屏之间的高速数据传输;②优化显示系统的功耗表现,减少电磁干扰(EMI);③通过灵活配置不同接口模式来适应各种显示设备的需求。 阅读建议:此文档面向具有一定电子工程背景的专业人士,建议读者结合实际项目需求深入理解各章节内容,特别是关于寄存器配置、序要求等方面的具体说明。对于初次接触此类技术的开发者而言,建议先熟悉基本概念再逐步掌握高级功能的应用方法。

81,111

社区成员

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

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