Ibatis2.3一个比较让人无奈的设计。目前还没想到好办法。

APOLLO_TS 2010-04-07 11:57:04
关于插入主键立刻返回主键值的知识,不能用存储过程。

目前如下:
调用的插入配置:单独调用一点问题没有。
<insert id="BatchAddForZh" parameterClass="ParamContext">
<![CDATA[
insert into t_salary (
AREA_ID, ORG_ID, USER_ID)
SELECT
A.AREA_ID as AREA_ID, A.ORG_ID as ORG_ID, USER_ID
from t_salary A
inner join t_acl_for_salary B on(A.AREA_ID=B.AREA_ID and A.ORG_ID=B.ORG_ID)
inner join t_workstate C on(B.ACC_ID=C.ACC_ID and C.RYLB_FLAG ='1')
]]>
<selectKey resultClass="java.lang.Integer" type="post" keyProperty="pkId">
SELECT LAST_INSERT_ID()
</selectKey>
</insert>

方法
@Transactional
public void batchAddSForZhFlow(ParamContext param){
saveWorkStateForZh(param);
int retVal=batchAddSalaryForZh(param);//这个调用以上的insert,这个没调用成功返回的就不是0了,返回saveWorkStateForZh执行后的主键值,数据库配置为可重复读。这样还是不行。
System.out.println(retVal);
if(retVal>0){
saveOrUpdateWorkStateForZh(param);
}
}
@Transactional(propagation = Propagation.NESTED)
public void saveWorkStateForZh(ParamContext param) {
也是一个插入操作
}
@Transactional(propagation = Propagation.NESTED)
public void saveOrUpdateWorkStateForZh(ParamContext param) {
也是一个插入操作
}
@Transactional(propagation = Propagation.NESTED)
public void batchAddSalaryForZh(ParamContext param) {
也是一个插入操作
}

问题出来了,saveWorkStateForZh插入的返回值为15,而batchAddSalaryForZh没有插入成功,那么返回可不是0哦,是15,因为这个方法使用的是一个DB连接,

有人说要用jta,我就更郁闷了,jta可不是所有容器都支持的,也就一些重量级容器有这样的服务。

目前把如下代码写入action中虽然可以用,但是也没有百分百优秀。
saveWorkStateForZh(param);
int retVal=batchAddSalaryForZh(param);
if(retVal>0){
saveOrUpdateWorkStateForZh(param);//如果这里出现错误,是应该回滚上一个操作,但是事物控制没有在action这一区间,虽然也很少出错,但是网络阻塞超过连接配置时间回滚也不一定完整。
}

也有如下的解决方案:
@Transactional
public void batchAddSForZhFlow(ParamContext param){
saveWorkStateForZh(param); //将此操作分离出来,但是这个方法的确和如下方法是一个原子事务操作。分离又有别的问题衍生。
int retVal=batchAddSalaryForZh(param);
if(retVal>0){
saveOrUpdateWorkStateForZh(param);
}
}

还有些朋友说,干脆合并成一个表,效率更高。。。。。

操作的是两个表,但是这两个表要保持数据一致对应。谁有类似经历可以多说说!也可看看如下人的观点:
http://topic.csdn.net/u/20100402/17/fffb62aa-a73b-49c8-b916-a1713d991777.html


...全文
264 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Trinx 2010-04-14
  • 打赏
  • 举报
回复
谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?
Trinx 2010-04-14
  • 打赏
  • 举报
回复
谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?
APOLLO_TS 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mawentao728 的回复:]

一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。
[/Quote]
如果数据库确定,使用的是SQL标准,外加对数据库查询调优有苛刻要求,同时又要SQL文档存储就要采用ibatis了。

如果产品发布,自动建库,数据库未知等就要用H了。

没有明显界限,主要还是看熟悉程度,我用ibatis主要是H的HQL优化sql很难看,同时批处理有点多,就使用了I结构。

如果使用分布式JVM,这些都不太好用,只能用EJB。
qq262067995 2010-04-14
  • 打赏
  • 举报
回复
合成一个表吧! 个人觉得比较实在 策略模式!
Trinx 2010-04-14
  • 打赏
  • 举报
回复
一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。
APOLLO_TS 2010-04-14
  • 打赏
  • 举报
回复
又来看看!
holsten32 2010-04-09
  • 打赏
  • 举报
回复
给点人气!!upupupupuup
APOLLO_TS 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sdyth3 的回复:]

Hibernate与IBatis的优缺点及可行性分析 http://www.phome.asia/forum/thread/17852.html

Spring与iBATIS的集成(转载) http://www.phome.asia/forum/thread/15905.html
[/Quote]

目前没时间看呀!谢谢提供!
colin_pxx 2010-04-07
  • 打赏
  • 举报
回复
hibernate的话我大概知道怎么返回
sdyth3 2010-04-07
  • 打赏
  • 举报
回复
Hibernate与IBatis的优缺点及可行性分析 http://www.phome.asia/forum/thread/17852.html

Spring与iBATIS的集成(转载) http://www.phome.asia/forum/thread/15905.html
guangfei1987 2010-04-07
  • 打赏
  • 举报
回复
偶没接触过ibatis 帮顶了...
  • 打赏
  • 举报
回复
接触ibatis的很少,学习
BearKin 2010-04-07
  • 打赏
  • 举报
回复
承蒙关照多年 没想到出了问题俺帮不上忙..只能一顶..
justwalking 2010-04-07
  • 打赏
  • 举报
回复
顶贴.

67,516

社区成员

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

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