Я хочу знать, как удалить связь "многие ко многим" с помощью вызова REST. Я могу создавать записи и связывать их, но не понимаю, как удалять.
У меня есть проект Spring Boot, в котором я использую REST и HATEOAS для обхода служб и контроллеров и прямого доступа к моему репозиторию.
У меня есть класс User Model/Domain
@Entity
@Table(name = "usr")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Version
private long version = 0;
@Id
@GeneratedValue(generator="optimized-sequence")
private Long id;
@Column(nullable = false, unique = true, length = 500)
@Size(max = 500)
private String userName;
@Column(nullable = false, length = 500)
@Size(max = 500)
private String firstName;
@Column(nullable = false, length = 500)
@Size(max = 500)
private String lastName;
@ManyToMany( fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable( name="user_role",
joinColumns={ @JoinColumn( name = "user_id",
nullable = false
)
},
inverseJoinColumns={ @JoinColumn( name="role_id",
nullable=false
)
}
)
private Set<Role> roles = new HashSet<Role>(0);
...Getters/Setters Below...
Как видите, у меня есть член roles, который является ассоциацией Many-To-Many с классом Role, код которого такой:
@Entity
public class Role {
@Id
@GeneratedValue(generator="optimized-sequence")
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String description;
...Getters/Setters Below...
Мои репозитории выглядят так:
Пользовательский репозиторий
public interface UserRepository extends
JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
List<User> findByUserName(String username);
}
Репозиторий Ролей
public interface RoleRepository
extends JpaRepository<Role, Long> {
}
Теперь все хорошо. Когда я получаю доступ к корню проекта из браузера, я получаю индекс/каталог репозитория в формате JSON+HAL. Замечательный.
(Обратите внимание, что я удаляю часть http:// из приведенного ниже теста, потому что StackOverflow засчитывает ее в мою квоту на ссылки)
Я, используя REST-клиент WizTools, отправляю HTTP.POST в репозиторий ролей ( localhost:8080/resttest/roles ) и создаю новую роль. Успех, ID роли #4 создан.
Затем я отправляю POST в репозиторий пользователей, чтобы создать пользователя ( localhost:8080/resttest/users ). Успех, идентификатор пользователя № 7 создан.
Затем я помещаю в репозиторий пользователя, чтобы создать ассоциацию с ролью:
PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: localhost:8080/resttest/roles/4
Здорово! Ассоциация сделана. Пользователь 9 теперь связан с ролью 4.
Теперь я не могу понять, как УДАЛИТЬ эту ассоциацию.
Я отправляю HTTP DELETE вместо PUT с той же командой, что и выше.
DELETE localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: localhost:8080/resttest/roles/4
Я получаю ответ: метод HTTP/1.1 405 не разрешен
{
"timestamp":1424827169981,
"status":405,
"error":"Method Not Allowed",
"exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
"message":"Request method 'POST' not supported"
}