我正在使用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);
.......
}
我很困惑,不知道出了什么问题。如果需要更多代码或配置,请告诉我。
感谢您的帮助! 问候。
答案 0 :(得分:1)
这是一项功能,请参阅Hibernate documentation:
事务持久化实例(即加载,保存的对象, 由Session创建或查询)可以被操作 应用程序,持久状态的任何更改都将保留 当会话被刷新时。这将在本章后面讨论。 无需调用特定方法(如update(),具有 不同的目的)使你的修改持久。
Hibernate会话保留其中加载的所有实体的缓存并跟踪它们的更改,当刷新会话时,它会发出SQL更新以将这些更改持久保存到数据库中。因此,如果您的对象处于持久状态(您已将其加载到当前会话中),则对其进行的任何更改都将保留,而不会调用save。