【问题标题】:Creating new entity plus association not working创建新实体和关联不起作用
【发布时间】:2018-05-02 18:19:30
【问题描述】:

我有两个实体 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;

用户组.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 注释。所以首先,删除这些。
  • 你解决过这个问题吗?我有同样的问题,似乎找不到一个好的解决方案!
  • @Jarmex 不幸的是没有。甚至没有赏金导致答案。我不太明白为什么没有适当的解决方案。我最终创建了自己的端点,该端点的行为符合预期-但这并不是我首先切换到JpaRepository 的原因。如果您找到解决此问题的好方法,请考虑在此处回答。 ^^

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


【解决方案1】:

试试

@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 的实例错误 它期望用户列表不是单个用户的实例

【讨论】:

    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多