关于事务,困惑我好久了,求解答!

a107494639 2011-04-14 03:57:58
比如说,我有个DaoTemplate类,里面写好了对数据库的各种常见操作。
我现在有个需求是这样的,有两张表,一张教师表,一张学生表,假设关系是一对多的关系。要求删除某个教师的同时,要删除该教师下的学生。
用的MVC设计风格。使用业务逻辑层调用dao层。大致代码如下:
//业务逻辑层
public boolean deleteTeacher(Teacher teacher){
DaoTemplate dao=new DaoTemplate();
if(dao.delete(teacher.getStudent()){
if(dao.delete(teacher)){
return true;
}
//这里空的地方我有疑问,假设同学被删除了,而教师删除失败怎么办,比如刚好网络断开了。
}
return false;
}

代码我随意打的,大意就是先删除学生,然后判断删除成功的话就删除该教师。问题在这里:
假设同学被删除了,而教师删除失败怎么办?
因为调用的是dao里的方法,所以两次调用里用的connection是不同的。所以我不知道这种事务怎么处理,听说有个JTA事务可以解决不同数据库之间的s事务问题的。我用的是tomcat,貌似不支持的说。
...全文
139 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
a107494639 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 x19881216 的回复:]
引用 7 楼 a107494639 的回复:

引用 6 楼 x19881216 的回复:
引用 5 楼 kvgnt 的回复:

如果不用hibernate.这样的操作我会写成一个方法 deleteAllByTeacher(teacher) .然后在里面附带删除students.


这种做法最好,这样只有一个事务,如果学生删除成功老师删除失败事务是会回滚的,而楼主的写法是2个事务……
[/Quote]

说的有道理,谢谢各位了,给分喽
小绵羊 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 a107494639 的回复:]

引用 6 楼 x19881216 的回复:
引用 5 楼 kvgnt 的回复:

如果不用hibernate.这样的操作我会写成一个方法 deleteAllByTeacher(teacher) .然后在里面附带删除students.


这种做法最好,这样只有一个事务,如果学生删除成功老师删除失败事务是会回滚的,而楼主的写法是2个事务,学生删掉了就回滚不了了。


可是这个方法……
[/Quote]

dao.delete(teacher)这个方法里面添加删除学生的操作。。。这个不涉及到业务逻辑啊。。。

学生是因老师而存在..老师不存在了学生当然就不会存在了

所以删除老师必须删除学生,这是一个整体操作

楼主理清他们之间的关系就明白了
a107494639 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 x19881216 的回复:]
引用 5 楼 kvgnt 的回复:

如果不用hibernate.这样的操作我会写成一个方法 deleteAllByTeacher(teacher) .然后在里面附带删除students.


这种做法最好,这样只有一个事务,如果学生删除成功老师删除失败事务是会回滚的,而楼主的写法是2个事务,学生删掉了就回滚不了了。
[/Quote]

可是这个方法不妥,因为这样就把业务逻辑层的代码写在DAO层里了。
不过,我想来想去也只能是这样子。
小绵羊 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kvgnt 的回复:]

如果不用hibernate.这样的操作我会写成一个方法 deleteAllByTeacher(teacher) .然后在里面附带删除students.
[/Quote]

这种做法最好,这样只有一个事务,如果学生删除成功老师删除失败事务是会回滚的,而楼主的写法是2个事务,学生删掉了就回滚不了了。
Rogue-Creasy 2011-04-14
  • 打赏
  • 举报
回复
如果不用hibernate.这样的操作我会写成一个方法 deleteAllByTeacher(teacher) .然后在里面附带删除students.
小绵羊 2011-04-14
  • 打赏
  • 举报
回复
在获取连接时conn.setAutoCommit(false);关闭自动提交事务
try{
删除老师操作;
删除学生操作;

//提交事务,此时老师和学生都将被删除
conn.commit();
}catch(Exception e){
conn.rollback();//如果出现异常则回滚事务
}
a107494639 2011-04-14
  • 打赏
  • 举报
回复
求助呀,高人解答一下。
a107494639 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hzw2312 的回复:]
使用Hibernate的级联删除:在Hibernate属性文件中的set节点里面:
添加cascade="delete"
在删除之前先把set集合添加完毕、
然后在删除对象、这样Hibernate就会自动给你级联删除!
[/Quote]
我没用hibernate哦,如果只是用jdbc就没有办法了吗?
BUG胡汉三 2011-04-14
  • 打赏
  • 举报
回复
使用Hibernate的级联删除:在Hibernate属性文件中的set节点里面:
添加cascade="delete"
在删除之前先把set集合添加完毕、
然后在删除对象、这样Hibernate就会自动给你级联删除!

81,092

社区成员

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

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