2015-09-30 29 views
0

我们使用Spring和IBatis,并且发现了一些有趣的事情,使用@Transactional处理服务方法处理多个返回相同记录的DAO调用。这是一个不起作用的方法的例子。Spring @Transactional DAO调用返回相同的对象

@Transactional 
public void processIndividualTrans(IndvTrans trans) { 
Individual individual = individualDAO.selectByPrimaryKey(trans.getPartyId());  

individual.setFirstName(trans.getFirstName()); 
individual.setMiddleName(trans.getMiddleName()); 
individual.setLastName(trans.getLastName()); 

Individual oldIndvRecord = individualDAO.selectByPrimaryKey(trans.getPartyId()); 
individualHistoryDAO.insert(oldIndvRecord); 

individualDAO.updateByPrimaryKey(individual); 
} 

上述方法的问题是,该线 individualDAO.selectByPrimaryKey的第二执行(trans.getPartyId()) 返回确切的对象从所述第一调用返回

这意味着oldIndvRecord和individual是同一个对象,并且行 individualHistoryDAO.insert(oldIndvRecord); 向包含更改(我们不需要)的历史记录表添加一行。

为了它的工作,它必须看起来像这样。

@Transactional 
public void processIndividualTrans(IndvTrans trans) { 
Individual individual = individualDAO.selectByPrimaryKey(trans.getPartyId());  
individualHistoryDAO.insert(individual); 

individual.setFirstName(trans.getFirstName()); 
individual.setMiddleName(trans.getMiddleName()); 
individual.setLastName(trans.getLastName()); 
individualDAO.updateByPrimaryKey(individual); 
} 

我们想写一个名为updateIndividual服务,我们可以利用此表,将存储在IndividualHistory表中的行执行更新之前的所有更新。

@Transactional 
public void updateIndividual(Individual individual) { 
Individual oldIndvRecord = individualDAO.selectByPrimaryKey(trans.getPartyId()); 
individualHistoryDAO.insert(oldIndvRecord); 
individualDAO.updateByPrimaryKey(individual); 
} 

但它不存储与对象更改前相同的行。我们甚至可以在DAO调用之前显式实例化不同的对象,而第二个对象与第一个对象相同。

我已经浏览了Spring文档,无法确定为什么会发生这种情况。

任何人都可以解释这一点吗?

是否有一个设置可以允许第二个DAO调用返回数据库内容而不是以前返回的对象?

+0

你能发表individualDAO和individualHistoryDAO的代码吗? – user2953113

+1

正确的行为,这应该是。 –

回答

1

您正在使用Hibernate作为ORM,如果在hibernate文档中完全描述了这种行为。在Transaction chapter

通过会议,这也是事务范围内的缓存,Hibernate提供可重复读取由标识符和实体的查询和报表不返回标量值的查询查找。

也是一样IBatis

的MyBatis使用两种缓存:本地缓存和二级缓存。每创建一个新会话 时MyBatis创建一个本地缓存并将其附加到会话。在会话中执行的任何查询将 存储在本地缓存中,因此具有相同输入参数的相同查询 的进一步执行将不会触及数据库。当更新,提交,回滚和关闭时,本地 缓存被清除。

+1

op正在使用ibatis – user2953113

+0

谢谢大家。我赞赏解释。 – user3757796

+0

@ user3757796然后接受答案 – JEY