spring - 创建新实体加关联不起作用

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

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

下面你可以看到关系是如何定义的:

应用用户.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"])"
}

最佳答案

尝试

@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"]
}

对于 Cannot deserialize instance of java.util.Set 错误 它需要一个用户列表而不是单个用户的实例

关于spring - 创建新实体加关联不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47376620/

相关文章:

java - hibernate java.lang.NoClassDefFoundError : org/hibernate/util/DTDEntityResolver

java.net.SocketException : Permission denied: connect Starting Tomcat 7 异常

hibernate - 为什么这个值对于我的 H2 表来说太长

java - RestRepositoryResource 的自动配置

java - Spring 数据 : Create entities (and DB entries) using boolean fields of another entity

java - 创建路由route1失败

html - 将 css 类添加到输入标签 thymeleaf + spring

java - 是否可以在 Spring Data Rest 中使用和组合 WHERE 子句?

java - Spring Data JPA 无法返回复杂表达式的正确结果

java - 使用 Spring Data JPA Stream 获取数据