Java 我如何在JPA/Hibernate中维护只有关系被持久化/合并到数据库

Java 我如何在JPA/Hibernate中维护只有关系被持久化/合并到数据库,java,spring,hibernate,rest,jpa,Java,Spring,Hibernate,Rest,Jpa,例如: 我有一个人实体,它与公民实体有很多关系。 个人和实体: // annotations @Entity public class Person { // ... @ManyToMany( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) @JoinTable( nam

例如: 我有一个人实体,它与公民实体有很多关系。 个人和实体:

    // annotations
    @Entity
    public class Person {

      // ...
      @ManyToMany(
        fetch = FetchType.LAZY,
        cascade = {CascadeType.PERSIST, CascadeType.MERGE}
      )
      @JoinTable(
        name = "persons_citizenships",
        joinColumns = {@JoinColumn(name = "PERSON_ID")},
        inverseJoinColumns = {@JoinColumn(name = "CITIZENSHIP_ID")}
      )
      private Set<Citizenship> citizenships = new HashSet<>();
      // ...
      // setters and getters
    }
现在的问题如下:如果我在REST服务中收到Person update的对象,并且如果我从json序列化了以下Person对象:

{
  "id": 2,
  "firstName": "Johnny",
  "citizenship": [
    {
      "id": 2,
      "country": {
        "id": 128
      }
    }
  ]
}
一切进展顺利,人员更新。但如果有人调用我的服务,但没有提供公民身份对象的所有信息,例如国家id,则会出现问题。在这种情况下,当JPA合并此实体时,它会级联到公民身份,并将国家id设置为空,这对我来说是一个很大的“不”。 本例的示例JSON:

{
  "id": 2,
  "firstName": "Johnny",
  "citizenship": [
    {
      "id": 2
    }
  ]
}
如何确保只有关系被持久化/合并,而不是子实体本身。我的意思是公民身份不会改变,我的服务的用户不应该通过个人更新来改变它。是的,我知道CascadeType.MERGE会这样做,但如果我删除了它,那么即使是关系也不会保存。我也不想在任何需要的解决方案中使用CascadeType.ALL(在任何情况下都包括CascadeType.REMOVE,因为其危险的副作用,请注意,我之前已经经历过)


请建议一些东西来验证这个案例。这对于我的应用程序来说是一个明显的安全问题,不希望依赖我的服务用户的意图…

如果理解正确,您只需要将“公民身份->国家关系”设置为不可为空。在此之后,您将得到一个例外。我建议您为您的http端点创建专用bean,并验证它们并将其映射到服务中的实体。感谢您的评论。所以你说我应该把公民身份中的所有栏目都标记为NotNull,并在使用我的服务时随身携带所有物品?我可以做只包含公民身份ID的DTO,但这意味着手动验证所有这些ID,这就是我试图解决的问题。如此失望。。。
{
  "id": 2,
  "firstName": "Johnny",
  "citizenship": [
    {
      "id": 2
    }
  ]
}