gpt4 book ai didi

java - Spring @Transactional DAO 调用返回相同的对象

转载 作者:行者123 更新时间:2023-11-30 03:14:57 26 4
gpt4 key购买 nike

我们正在使用 Spring 和 IBatis,并且我发现了一些有趣的事情,即带有 @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 调用返回数据库内容而不是之前返回的对象?

最佳答案

您正在使用 Hibernate 作为 ORM,并且 Hibernate 文档中完美地描述了此行为。在 Transaction chapter :

Through Session, which is also a transaction-scoped cache, Hibernate provides repeatable reads for lookup by identifier and entity queries and not reporting queries that return scalar values.

IBatis 也是如此

MyBatis uses two caches: a local cache and a second level cache. Eachtime a new session is created MyBatis creates a local cache andattaches it to the session. Any query executed within the session willbe stored in the local cache so further executions of the same querywith the same input parameters will not hit the database. The localcache is cleared upon update, commit, rollback and close.

关于java - Spring @Transactional DAO 调用返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com