创建新实体加关联无法正常工作。

3

我有两个实体 AppUserUserGroup,它们之间有一个 @ManyToMany 的关系。

我目前正在尝试像这样为现有用户创建并关联一个新组:

POST http://localhost:8080/groups

{
  "name": "Group 1", 
  "users": ["http://localhost:8080/users/1"]
}

问题在于只创建了群组,但没有与列出的用户建立联系,而且服务器仍然响应201 Created?!

这是两个存储库:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface AppUserRepository extends JpaRepository<AppUser, Long> {
    AppUser findByUsername(@Param("username") String username);
}

@RepositoryRestResource(collectionResourceRel = "groups", path = "groups")
public interface UserGroupRepository extends JpaRepository<UserGroup, Long> {
    List<UserGroup> findByName(@Param("name") String name);
}

以下是关系的定义:

AppUser.java

@Column(name="user_group_id")
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "app_user__user_group",
        joinColumns = {
                @JoinColumn(name = "app_user_id", nullable = false, updatable = false) },
        inverseJoinColumns = {
                @JoinColumn(name = "user_group_id", nullable = false, updatable = false)})
private Set<UserGroup> groups;

UserGroup.java

@Column(name = "app_user_id")
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "groups")
private Set<AppUser> users;

注意:

如果我只传递一个字符串而不是users列表:

POST http://localhost:8080/groups

{
  "name": "Group 1", 
  "users": "http://localhost:8080/users/1"
}

我得到的是:

{
  "cause": {
    "cause": null,
    "message": "Cannot deserialize instance of java.util.Set out of VALUE_STRING token at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 7, column: 12] (through reference chain: mahlzeit.api.hibernate.model.UserGroup["users"])"
  },
  "message": "JSON parse error: Cannot deserialize instance of java.util.Set out of VALUE_STRING token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.Set out of VALUE_STRING token at [Source: (org.apache.catalina.connector.CoyoteInputStream); line: 7, column: 12] (through reference chain: mahlzeit.api.hibernate.model.UserGroup["users"])"
}

你的 @ManyToMany 关联上不应该有 @Column 注解。因此,首先要将其移除。 - Alan Hay
你解决过这个问题吗?我也遇到了同样的问题,但似乎找不到一个简洁的解决方案! - Jarmex
1
很遗憾,@Jarmex,没有。即使是赏金也没有得到答案。我不太明白为什么没有一个合适的解决方案。最终我自己创建了一个符合要求的端点 - 但当然这不是我一开始转换到JpaRepository的原因..如果你找到了一个好的解决方案,请考虑在这里回答。^^ - Stefan Falk
1个回答

0

尝试

@Column(name = "app_user_id")
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "groups",cascade = CascadeType.ALL)
private Set<AppUser> users;

最后返回用户列表

{
  "name": "Group 1", 
  "users": ["http://localhost:8080/users/1"]
}

对于无法反序列化java.util.Set实例的错误,它期望用户列表而不是单个用户的实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接