【问题标题】:Patch request for changing ManyToMany association更改多对多关联的补丁请求
【发布时间】:2017-09-09 18:48:21
【问题描述】:

需要一些关于 REST api 的帮助,以使用 spring 数据休息来处理员工和角色之间的多对多关系

@Entity
@Table(name="employees")
public class Employee  {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="employees_id_seq")
    @SequenceGenerator(name="employees_id_seq", sequenceName="employees_id_seq", allocationSize=1)
    @Column(name="EMPLOYEE_ID")
    private Long id;

    @NotNull
    private String email;

    @ManyToMany(cascade={}, fetch=FetchType.EAGER, targetEntity=Role.class) 
    @JoinTable(
        name="employee_roles",
        joinColumns=@JoinColumn(name="EMPLOYEE_ID", referencedColumnName="EMPLOYEE_ID"),
        inverseJoinColumns = @JoinColumn(name="ROLE_ID", referencedColumnName="ROLE_ID")
    )
    private List<Role> roles;

    public Employee() {
        System.out.println("Employee created");
    }

    public Employee(long id, String firstName, String lastName, String email) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

// Getters , Setter, etc.
}

@Entity
@Table(name="roles")
public class Role {

    @Id
    @Column(name="ROLE_ID")
    private String roleId;
    private String roleName;

    public Role() {

    }
// Getters, Setters, etc
}

Spring 数据存储库:

import org.springframework.data.repository.CrudRepository;
public interface EmployeeRepository extends CrudRepository<Employee, Long>{}

从rest api收到的以json表示的当前数据库状态:

{
"firstName": "First1",
"lastName": "Last1",
"email": "first_last@acme.com",
"roles": [ {"roleName": "User"}, {"roleName": "Admin"}],
"locationId": 43,
"_links": {
"self": {
"href": "http://localhost:8091/employees/1"
},
"employee": {
"href": "http://localhost:8091/employees/1"
}
}
}

我在数据库中有以下角色数据:

从角色中选择role_id、role_name

role_id   role_name
-------   -------
adm       Admin
usr       User

我想删除用户角色并保留用户的管理员角色。我正在尝试将 PATCH 请求与以下有效负载一起使用

{
"roles": [ {"roleId": "adm"}]
}

不幸的是它导致了错误:

org.hibernate.HibernateException: Role 实例的标识符已从 usr 更改为 adm

如果我尝试使用有效负载删除角色 Admin

{ 
  "roles": [ {"roleId": "usr"}] 
}

效果很好。

似乎行为取决于角色 ID 的顺序。

感谢任何帮助或建议。

【问题讨论】:

    标签: spring hibernate rest spring-data-jpa spring-data-rest


    【解决方案1】:

    在 SDR 中更改角色集合的正确机制是发送 PATCH 请求,如下所示:

    { 
      "roles": [ 
          "http://localhost:8091/roles/adm",
          "http://localhost:8091/roles/usr"
      ] 
    }
    

    但是,请参阅 Hopper SR5 中引入的以下回归,并将在 Hooper SR9 中修复。

    https://jira.spring.io/browse/DATAREST-1041

    【讨论】:

    • 非常感谢 Alan,我使用了您建议的有效负载并遇到了与 jira.spring.io/browse/DATAREST-1041 中描述的相同的问题。将尝试升级我的设置。
    • 现在,如果您回滚到 Hopper-SR4 版本,它将可以工作。
    • 我对这些东西很陌生。我应该如何指定这个版本?目前我在项目的 pom 中有以下内容: <dependency><groupid>org.springframework.data</groupid><artifactid>spring-data-rest-webmvc</artifactid><version>2.6.2.BUILD -SNAPSHOT</version></dependency> 这个存储库(maven didi 找不到与 Initializr 创建的 pom 的依赖关系) <repository><id>my-repo1</id><name>你的自定义 repo</name><url><a href="/default/index/tourl?u=aHR0cDovL3JlcG8uc3ByaW5nLmlvL2xpYnMtc25hcHNob3Q8L3VybA%3D%3D" rel="nofollow" target="_blank">repo.spring.io/libs-snapshot&lt;/url</a>&gt; </url></repository>
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2020-11-11
    • 2014-04-20
    • 2013-11-16
    相关资源
    最近更新 更多