Hibernate批量操作的事物问题,相当奇怪,大侠请进

雨雪飘零 2009-07-02 06:16:21
环境 : MySql

操作 : 批量新增

要求 : 如果其中一笔数据出现错误,掠过这一笔,继续新增下一笔数据。
例 : 共有 5 笔数据,其中第3笔出现错误,不能新增到DB, 那么继续处理后面的 2 笔,最后新增到DB中的数据
应该有 4 笔(第1,2,4,5笔)。

使用以下代码,最后DB中一笔数据也没有


// method start

Transaction tx = this.session.beginTransaction();

for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
}
catch (HibernateException e) {

}
}

tx.commit();

// method end


后又改了一下代码,还是不行。出错那笔数据以前新增的,可以成功,但是以后的全都不能新增
即 : 共有 5 笔, 第 3 笔出错,DB 中只能新增第1,2笔,第3,4,5笔都不行

// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
// ~~~
}
}
// method end


那位大侠可以解决,不胜感激!
...全文
137 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
frdgo 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ligaoyang 的回复:]
引用 1 楼 java2000_net 的回复:
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!



现在这样的代码出了异常也不会退出循环啊
[/Quote]
???
抛出异常后,并catch后,程序不就在抛出的点终止了么?
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) {

}
}

你的问题似乎和事务没有关系。把事务去掉试试。
因为你这个批处理不要保证数据的事务的原子性(当有一条记录错误时,直接过,接着往下走)。
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
for (int i = 0; i < list.size(); i++) {
try {
this.session.saveOrUpdate(list.get(i));
tx.commit();//如果不用这句话要把session变成自动提交
}
catch (HibernateException e) {

}
}

txf_7337 2009-07-03
  • 打赏
  • 举报
回复

Transaction tx = session.getTransaction();
for (int i = 0; i < list.size(); i++) {
try {
tx.begin();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
}
finally{
tx = session.getTransaction();
}
}

不知道行不行。。。
zjwfisheep 2009-07-03
  • 打赏
  • 举报
回复
这个问题似乎不用事务就可以了,反正你也要不要保证这批数据的原子性。
雨雪飘零 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 frdgo 的回复:]
引用 4 楼 ligaoyang 的回复:
引用 1 楼 java2000_net 的回复:
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!


现在这样的代码出了异常也不会退出循环啊


???
抛出异常后,并catch后,程序不就在抛出的点终止了么?
[/Quote]

如果异常被 Catch 住,则 Catch 以后的代码依然会执行,但是从出错点到Catch之间的代码不会执行。
就此代码而言,异常被Catch住后,会继续执行 Catch 一下的代码,但是 Catch 一下已经没有代码了,
所以会继续执行下一次循环。
雨雪飘零 2009-07-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Landor2004 的回复:]
出错之后,当前事务既没提交也没回滚,数据库一直等待超时,你可以这么修改


Java code// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
// ~~~

[/Quote]

经测试,依然不行。 哎~~~~
zm_hs 2009-07-03
  • 打赏
  • 举报
回复
关注一下! 不能把5笔数据分成5部分吗?
txf_7337 2009-07-03
  • 打赏
  • 举报
回复
开启5个事务,每笔数据都不会影响,LZ想想行的通不?
如果交给SPRING控制事务,那就简单多了。。。
Landor2004 2009-07-03
  • 打赏
  • 举报
回复
出错之后,当前事务既没提交也没回滚,数据库一直等待超时,你可以这么修改

// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
tx.rollback();
// ~~~
}
}
// method en
liudejie 2009-07-03
  • 打赏
  • 举报
回复
// method start
for (int i = 0; i < list.size(); i++) {
try {
Transaction tx = this.session.beginTransaction();

this.session.saveOrUpdate(list.get(i));

tx.commit();
}
catch (HibernateException e) {
if(tx!=null){
tx.rollback();
}
// ~~~
}finally{
if(session!=null){
session.close();
}
}
}
// method en
看看这样行不
laynepeng 2009-07-02
  • 打赏
  • 举报
回复
不熟,N长时间没Hibernate了,也没有环境测试。但是,我建议你第二种的时候,加个finally把tx关掉,并置为null,再试试。。。。

否则,你的this.session一直是出错状态。

我猜的。。。
雨雪飘零 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huhaibo777 的回复:]
sorry,没看清题目
[/Quote]

不用 sorry, 你帮我想个办法就行了, 哈~
雨雪飘零 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!
[/Quote]

现在这样的代码出了异常也不会退出循环啊
huhaibo777 2009-07-02
  • 打赏
  • 举报
回复
sorry,没看清题目
huhaibo777 2009-07-02
  • 打赏
  • 举报
回复
你那个list是可以批量更新的,这样做你累不累。
还有,你后改的那个方法极不可取,自己玩玩还可以。
老紫竹 2009-07-02
  • 打赏
  • 举报
回复
this.session.saveOrUpdate(list.get(i));

你为何不把这一行放到一个单独的try/catch里面呢。这样除了异常,就不至于退出循环了!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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