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

如何防止Hibernate删除JSON帖子中不存在的子对象?

轩辕经国
2023-03-14

我有一个JPA属性实体,它有子实体(多个比率和多个保留)。在我的JavaScript应用程序中,我通过REST{属性:{速率:[…],拉取JSON,保留[…]} 。速率和保留非常详细,因此当我发布属性更新(如更改名称)时,我会从JSON post有效负载中删除速率和保留。我希望Hibernate可以忽略掉丢失的钥匙,但遗憾的是,它正在删除save上的所有孩子。如果它们不存在,我如何指定Hibernate以忽略它们?

@Entity
public class Property {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    String name;

    @OneToMany(mappedBy = "property", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JsonManagedReference
    private Set<SeasonRate> rates = new HashSet<>();

    @OneToMany(mappedBy = "property", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    private Set<Reservation> reservations = new HashSet<>();

}

Ps:我对级联的理解是有限的,但我确实想要这样一种功能,即如果有人删除某个属性,它必须删除费率和预订。但是,我在任何地方都不能通过完整的属性保存来更新费率或预订,所以也许我应该只使用CASCADE=update?价格有自己的更新机制,预订也有自己的更新机制。

共有1个答案

魏硕
2023-03-14

但是,如果您使用的是Spring MVC Rest控制器而不是Spring Data Rest控制器来处理更新,则前者似乎不支持部分更新/补丁请求

使用传统的非restful web应用程序,通过表单直接修改实体,这当然是可能的。例如:

@RequestMapping
public String updateEntity(@ModelAttribute myEntity){
  //submitted form parameters merged to existing entity 
  //loaded via getMyEntity() leaving unmodified fields as they were
}

@ModelAttribute
public MyEntity getMyEntity(){
  //load some existing entity
} 

但是,当通过@RequestBody将JSON绑定到实体时,这是不可能的:

@RequestMapping
public String updateEntity(@RequestBody myEntity){
  //new instance instantiated by the Jackson mapper
  //missing fields will be null
}

在这方面有一些杰出的圣战:

https://jira.spring.io/browse/SPR-13127

https://jira.spring.io/browse/SPR-10552

https://jira.spring.io/browse/SPR-13127

以及各种SO问题:

Spring部分更新对象数据绑定

然而,好消息是Spring Data Rest确实支持通过补丁进行部分更新,因此如果可以选择将您的存储库公开为Rest Repository,那么您应该能够实现所需的行为:

https://spring.io/guides/gs/accessing-data-rest/

PUT替换整个记录。未提供的字段将替换为null。PATCH可用于更新项目子集。

 类似资料:
  • 创建帖子时,我的用户会提供一个外部链接。如果删除了外部链接,本地帖子也应该删除。为了实现这一点,我尝试运行以下代码... ...但是我得到了这些错误... 警告:get_headers(): php_network_getaddresses: getaddrinfo failed: name or service in /home/cornwal2/public_html/listings/wp-

  • 我试图删除特定id的帖子,但它给我错误为:代理错误:无法代理请求 /api/posts从localhost:3001http://localhost:8000。有关更多信息,请参阅https://nodejs.org/api/errors.html#errors_common_system_errors(ECONNREFUSED)。 这是我的行动: 这是我的减速机: 这是我的组件中使用的代码: 这

  • 问题内容: 如果你这样做 然后,当您看着时,您就会得到。(很公平。) 如果这样做,您会得到。 基本上,我正在寻找一种将其转换为string的方法。 显然,在现实生活中,我无法控制JSON输入,而是从Web服务获取JSON …我想使用浏览器的JSON解析器解析JSON,并能够识别数字值和。 除了手动读取JSON字符串外,还有什么方法可以做到这一点?在这种情况下,这实际上是不可能的,为了提高速度,我需

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应

  • 我有一个模范国家,因此有一个表国家。countries表作为iso国家和货币代码的集合,不应该减少这些内容(在我用种子数据填充之后)。因为Country是ActiveRecord::Base的一个子类,所以它继承了诸如destroy、delete_all等类方法来删除记录。我正在寻找一种解决方案,以防止在模型级别删除记录。 Ofc。我知道我可以使用面向对象的方法来解决这个问题,方法是重写这个方法(