【问题标题】:Spring (Hibernate) - incomplete serialization result / many-to-manySpring (Hibernate) - 不完整的序列化结果/多对多
【发布时间】:2018-08-16 19:21:09
【问题描述】:

Rest Application / Spring MVC - 3 个实体:User、AccessRole、AccessPermision。 每个用户只有一个角色,每个角色都有一个或多个权限。 在序列化具有相同角色的用户期间会出现此问题。 在这种情况下,JSON 序列化结果仅包含第一个用户的权限。

用户实体

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import socialcreek.access.model.AccessRole;
import socialcreek.user.views.UserViews;
import javax.persistence.*;
import java.util.Set;

@Entity 
@Table(name = "users")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")

public class User {

    /**-----------------------------------------------------
     * Constructor
     -------------------------------------------------------*/

    public User(){  }

    public User(String username, String password, AccessRole accessRole) {
        this.username = username;
        this.password = password;
        this.userAccessRole = accessRole;
    }

    /**-----------------------------------------------------
     * Entity Properties
     -------------------------------------------------------*/

    @Column()
    @Id
    @JsonView(UserViews.BasicView.class)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JsonView(UserViews.BasicView.class)
    private String username;
    private String password;

    @JsonView(UserViews.BasicView.class)
    @ManyToMany(mappedBy = "users",fetch=FetchType.EAGER)
    private Set<UsersGroup> usersGroups;

    @ManyToOne(targetEntity = AccessRole.class, optional = false,fetch = FetchType.EAGER, cascade=CascadeType.MERGE)
    @JoinColumn(name = "user_role")
    @JsonView(UserViews.BasicView.class)
    private AccessRole userAccessRole;


    /**-----------------------------------------------------
     * Setters & Getters
     -------------------------------------------------------*/

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() { 
        return username; 
    } 

    public void setUsername(String username) { 
        this.username = username; 
    } 

    public String getPassword() { 
        return password; 
    } 

    public void setPassword(String password) { 
        this.password = password; 
    }

    public Set<UsersGroup> getUsersGroups() {
        return usersGroups;
    }

    public void setUsersGroups(Set<UsersGroup> usersGroups) {
        this.usersGroups = usersGroups;
    }

    public AccessRole getUserAccessRole() {
        return userAccessRole;
    }

    public void setUserAccessRole(AccessRole userAccessRole) {
        this.userAccessRole = userAccessRole;
    }
}

AccessRole 实体

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import socialcreek.user.views.UserViews;

import javax.persistence.*;
import java.util.Set;

@Entity
@Table(name = "access_role")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class AccessRole {


    /**-----------------------------------------------------
     * Entity Properties
     -------------------------------------------------------*/

    @Id
    @JsonView(UserViews.BasicView.class)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JsonView(UserViews.BasicView.class)
    private String roleName;

    @JsonView(UserViews.BasicView.class)
    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
    @JoinTable(name = "access_role_permissions")
    private Set<AccessPermission> accessPermissions;

    /**-----------------------------------------------------
     * Setters & Getters
     -------------------------------------------------------*/


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public Set<AccessPermission> getAccessPermissions() {
        return accessPermissions;
    }

    public void setAccessPermissions(Set<AccessPermission> accessPermissions) {
        this.accessPermissions = accessPermissions;
    }


}

AccessPermission 实体

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import socialcreek.user.views.UserViews;

import javax.persistence.*;


@Entity
@Table(name = "access_permission")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = "id")
public class AccessPermission {

    /**-----------------------------------------------------
     * Entity Properties
     -------------------------------------------------------*/

    @Id
    @JsonView(UserViews.BasicView.class)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @JsonView(UserViews.BasicView.class)
    private String permissionName;


    /**-----------------------------------------------------
     * Setters & Getters
     -------------------------------------------------------*/


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPermissionName() {
        return permissionName;
    }

    public void setPermissionName(String permissionName) {
        this.permissionName = permissionName;
    }

}

序列化结果:

[ { "id":70, "username":"admin", "usersGroups":[], "userAccessRole":{ "id":68, "roleName":"ROLE_ADMIN", "accessPermissions":[ { “身份证”:69, "permissionName":"FULL_ACCESS" }]} }, {“id”:71,“用户名”:“admin2”,“usersGroups”:[],“userAccessRole”:68} ]

请查看 accessRole 和 accessPermision 信息 - 它仅适用于 user:admin。在 user:admin2 的情况下,只有关于 accessRoleId 的信息(没有关于 roleName、accessPermision 的信息) 仅当两个用户具有相同的 accessRole 时才会发生这种情况。如果我将 user:admin2 的 accessRole 更改为另一个角色-everythnink 就可以了。

【问题讨论】:

    标签: spring hibernate serialization jackson many-to-many


    【解决方案1】:

    我发现了与正确答案 (https://stackoverflow.com/a/27117097/4694022) 类似的问题。 问题是由@JsonIdentityInfo 引起的。在我删除它之后 - 它可以工作......现在我需要找到处理递归结构序列化的解决方案,但这是另一个故事......

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2012-09-28
      相关资源
      最近更新 更多