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

时间:2021-12-29 10:54:21
关于插入主键立刻返回主键值的知识,不能用存储过程。

目前如下:
  调用的插入配置:单独调用一点问题没有。
  <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


14 个解决方案

#1


hibernate的话我大概知道怎么返回

#2


顶贴.

#3


承蒙关照多年 没想到出了问题俺帮不上忙..只能一顶..

#4


接触ibatis的很少,学习

#5


偶没接触过ibatis  帮顶了...

#6


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

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

#7


引用 6 楼 sdyth3 的回复:
Hibernate与IBatis的优缺点及可行性分析  http://www.phome.asia/forum/thread/17852.html

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


目前没时间看呀!谢谢提供!

#8


给点人气!!upupupupuup

#9


又来看看!

#10


一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。

#11


合成一个表吧! 个人觉得比较实在 策略模式!

#12


引用 10 楼 mawentao728 的回复:
一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。

如果数据库确定,使用的是SQL标准,外加对数据库查询调优有苛刻要求,同时又要SQL文档存储就要采用ibatis了。

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

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

如果使用分布式JVM,这些都不太好用,只能用EJB。

#13


谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?

#14


谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?

#1


hibernate的话我大概知道怎么返回

#2


顶贴.

#3


承蒙关照多年 没想到出了问题俺帮不上忙..只能一顶..

#4


接触ibatis的很少,学习

#5


偶没接触过ibatis  帮顶了...

#6


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

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

#7


引用 6 楼 sdyth3 的回复:
Hibernate与IBatis的优缺点及可行性分析  http://www.phome.asia/forum/thread/17852.html

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


目前没时间看呀!谢谢提供!

#8


给点人气!!upupupupuup

#9


又来看看!

#10


一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。

#11


合成一个表吧! 个人觉得比较实在 策略模式!

#12


引用 10 楼 mawentao728 的回复:
一直都很想了解什么时候用Hibernate什么时候用ibatis,而且个框架公司用的比较多,希望哪位朋友能多多指点下,提前谢谢了。

如果数据库确定,使用的是SQL标准,外加对数据库查询调优有苛刻要求,同时又要SQL文档存储就要采用ibatis了。

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

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

如果使用分布式JVM,这些都不太好用,只能用EJB。

#13


谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?

#14


谢谢楼主了,我只用过Hibernate,没用过ibatis,所以对它们的区别基本没什么了解,现在就是不知道公司用哪个多些,想自学下ibatis,由于时间原因不知道该学不?