当前位置: 首页 > 知识库问答 >
问题:

Spring Data、JPA和HiberNate:为什么我的对象保存时删除了保存语句?

颜霖
2023-03-14

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

-----数据----

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

我的测试中没有使用FriendGroupRepositoryCustom中定义的方法。该测试只涉及来自CrudePository接口的一种方法。

-----服务----

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

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

}

在我从上面删除FriendGroupRepository.save(group);之后,对象仍然保存到数据库中。我做了调试和跟踪,并确认当我提交表单时确实调用了这个方法。

------ web控制器 ---------

@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个答案

柴亦
2023-03-14

这是一个功能,请参阅HiberNate留档:

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

HiberNate会话保存所有加载实体的缓存,并跟踪对它们的更改,当会话刷新时,它会发出SQL更新来将这些更改持久化到数据库中。因此,如果您的对象处于持久状态(您已经在当前会话中加载了它),对它的任何更改都将被持久化,而无需调用保存。

 类似资料:
  • 我在保存具有ManyToOne双向关系的实体时遇到问题,如下所示: 警告:HHH000437:试图保存一个或多个与未保存的瞬态实体具有不可为空的关联的实体。在保存这些从属实体之前,必须在操作中保存未保存的瞬态实体。未保存的临时实体:([com . epam . apartments booking . model . city # 912])依赖实体:([[com . epam . apartme

  • 在发出delete操作之前,我必须在表行上更新这些信息(before delete触发器将负责从表中复制相关数据)。当我尝试从hibernate保存并删除时,hibernate将完全跳过保存。当然...假设如果要删除实体,那么执行保存操作是没有意义的,这是有意义的....但这不是我刚才告诉你的情况。 在执行删除之前提交事务可能会成功,但这意味着需要一个新的事务,加上我正在处理的更多对象必须重新加载

  • 问题内容: 我在父子表之间存在一对多关系。在父对象中,我有一个 我在子表中也有一个外键。此外键是引用数据库中父行的ID。因此,在我的数据库配置中,此外键不能为NULL。同样,此外键也是父表中的主键。 所以我的问题是如何通过执行以下操作来自动保存子对象: 我尝试了上面的方法,但是我收到一个数据库错误,抱怨Child表中的外键字段不能为NULL。是否可以告诉JPA自动将此外键设置为Child对象,以便

  • 当我读到cascade和inverse时,有人说它们都在做完全不同的事情。级联:在级联中,在一个操作(保存、更新和删除)完成后,它决定是否需要调用其他操作(保存、更新和删除)对其他相互有关系的实体。反向:这用于决定哪一方是管理关系的关系所有者(插入或更新外键列)。 假设我保存有一些孩子的父级。所以当我一方面用inverse="true"cascade="all"设置一对多时,我希望孩子是关系的所有

  • 我正在尝试删除hibernate中的子实体,但遇到以下异常: 这些是我的实体: @table(name=“Customer”)公共类Customer{ @OneTomany(Cascade=CascadeType.All,MappedBy=“CustomerID”,OphanRemoval=True)私有集QuoteConfig; 这是我想要移除的部分 我的问题是如何删除子实体QuoteConfi