我们使用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调用返回数据库内容而不是以前返回的对象?
你能发表individualDAO和individualHistoryDAO的代码吗? – user2953113
正确的行为,这应该是。 –