2

我正在使用 Spring Data、JPA 和 Hibernate 做一个 Spring Web 应用程序。我正在测试事物并注意到即使在我删除了服务层中的保存语句之后我的对象也被保存了。以下是详细信息:

- - - 数据 - -

public interface FriendGroupRepository extends CrudRepository<FriendGroup, Long>, FriendGroupRepositoryCustom {
}

我的测试中没有使用 FriendGroupRepositoryCustom 中定义的方法。该测试仅涉及 CrudRepository 接口中的一种方法。

- - - 服务 - -

@Service
@Repository
@Transactional
public class AccountServiceImpl implements AccountService  {

@Override
@Transactional
public void saveFriendGroup(FriendGroup group) {
    friendGroupRepository.save(group);
}

}

在我删除了friendGroupRepository.save(group); 从上面,对象仍然被保存到数据库中。我进行了调试和跟踪,并确认在我提交表单时确实调用了此方法。

------ 网络控制器 ---------

@RequestMapping(value={"/formtest"}, method=RequestMethod.POST)
public String formPost(HttpServletRequest request, 
    Model model, Map<String, Object> map,
        @ModelAttribute("command") FriendGroup fg,
        BindingResult result, 
        SessionStatus status ){

    ......
    accountService.saveFriendGroup(fg);     
    .......
}

我很困惑,不知道出了什么问题。如果需要更多代码或配置,请告诉我。

谢谢你的帮助!问候。

4

1 回答 1

2

这是一项功能,请参阅Hibernate 文档

事务性持久实例(即由 Session 加载、保存、创建或查询的对象)可以由应用程序操作,并且在刷新 Session 时,对持久状态的任何更改都将被持久化。这将在本章后面讨论。无需调用特定方法(如具有不同目的的 update())来使您的修改持久化。

Hibernate 会话保存所有加载到其中的实体的缓存并跟踪它们的更改,当刷新会话时,它会发布 SQL 更新以将这些更改持久保存到数据库中。因此,如果您的对象处于持久状态(您已在当前会话中加载它),则对其进行的任何更改都将保持不变,而无需调用 save。

于 2013-07-16T16:36:08.740 回答