我想知道如何通过REST调用删除多对多关联。我能够创建记录并将其关联,但不知道如何删除。
我有一个SpringBoot项目,在这个项目中,我使用REST和HATEOAS绕过服务和控制器,并直接公开我的存储库。
我有一个用户模型/域类
@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成员,它与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格式的存储库索引/目录。精彩的
(注意,我正在从下面的测试中删除超文本传输协议://部分,因为StackOverflow将其计入我的链接配额)
我,使用WizTools REST Client,HTTP. POST到角色(localhost:8080/resttest/roles)存储库并创建一个新的角色。成功,角色ID#4创建。
然后我发布到用户存储库以创建一个用户(localhost:8080/restest/users)。成功,用户ID#7已创建。
然后,我将其放入User存储库,以创建与角色的关联:
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.1405方法
{
"timestamp":1424827169981,
"status":405,
"error":"Method Not Allowed",
"exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
"message":"Request method 'POST' not supported"
}
从文档中:
删去
...
405方法不允许-如果关联是非可选的
PUT
表示替换整个角色集。因此,要删除一个链接,请
放置所有剩余链接。如果您只有一个链接,并且希望将其删除,您将
放入一个空集合:
PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body:
BTW:您不会发送带有
DELETE
请求的正文。这没有意义。
编辑
另请参阅Spring HATEOAS开发者的回答。
尽管使用剩余元素创建一个PUT
请求可以做到这一点,DELETE
是一个可接受的删除关联资源的命令,在大多数情况下更易于使用。
就你的例子而言,这应该是可行的:
DELETE localhost:8080/resttest/users/7/roles/4
另一方面,在创建关联时,预期负载中会有URI。您不需要在正文中写入整个URL,这就足够了:
PUT localhost:8080/resttest/users/7/roles
Content-type: uri-list
Body: /roles/4
希望这有帮助。
我们需要改变这种反应: 到_链接上的唯一“自我”部分:
由于我的域类中存在不明确的关联,新添加的正在引发。 链接数组如下所示:
我在Spring Boot中遇到了一个多对多关系问题。代码如下: 和 当然,我有表,在其中,在任务中插入标签并保存该任务后,会出现一个条目。但是,当我删除标签(或清除它们)时,条目不会从连接表中删除。这是测试: task\u tag表确实在这两列(并且仅在这两列)上形成了一个复合索引。 我做错了什么?我遵循了每一条建议和建议——使用集合代替列表,使用助手方法,清理等等。。。我找不到窃听器。 非常感
在使用@RepositoryRestResource将域对象导出到Rest时,如何在Java中创建Neo4j关系?
概述 使用remove()方法从集合中删除文档。这个方法需要一个条件文档用来决定哪些文档将被删除。 删除匹配的所有文档 下面的操作将删除指定条件匹配的所有文件: db.restaurants.remove( { "borough": "Manhattan" } ) 删除操作返回一个WriteResult对象,它包含了操作的状态信息。nRemoved字段值表示被删除的文档数量。 使用justOne可
删除数据Delete方法,参数为struct的指针并且成为查询条件。 user := new(User) affected, err := engine.Id(id).Delete(user) Delete的返回值第一个参数为删除的记录数,第二个参数为错误。 注意:当删除时,如果user中包含有bool,float64或者float32类型,有可能会使删除失败。具体请查看 FAQ