Spring Data,JPA和Hibernate:为什么在删除save语句的情况下保存我的对象?

时间:2013-07-16 16:11:56

标签: spring hibernate jpa

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

-----数据----

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);     
    .......
}

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

感谢您的帮助! 问候。

1 个答案:

答案 0 :(得分:1)

这是一项功能,请参阅Hibernate documentation

  

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

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