【发布时间】: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