为没有FetchType.EAGER的用户分配角色



我有一个@ManyToMany表输入图像

角色表包含角色role_USERrole_ADMIN等。

下面我展示了如何在用户角色表之间创建关系。

角色.class

@ManyToMany(mappedBy = "roleList", cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
private List<User> userList = new ArrayList<>();

public void addPerson(User user) {
userList.add( user );
user.getRoleList().add( this );
}

用户.class

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private List<RoleUser> roleUserList = new ArrayList<>();

public void addRole(Role role) {
roleList.add(role);
role.getUserList().add( this );
}

假设我在role表中已经有一个角色列表。现在我想创建一个用户,并为其分配其中一个角色。

在这种情况下,我尝试执行以下操作:

我指定FetchType.EAGER(这对我来说是不可取的。否则它就不起作用(,然后我在控制器中写下以下内容:

Role role = serviceJpa.findRoleByRoleName("ROLE_USER");
role.addUser(user);
serviceJpa.saveRole(role);

如果我们看一看,用户已经完美添加,并且角色已经成功分配给该用户。

但正如我之前所说,FetchType.EAGER对我来说并不可取,因为我不想在访问角色表时获得一百万用户。

但是如果我使用FetchType.LAZY,那么会抛出一个异常:

消息请求处理失败;嵌套异常为org.hubinate.LazyInitializationException:未能延迟初始化角色的集合:com.testmany.entity.role.userList,可以没有初始化代理-没有会话

这里我立刻有一个问题-也许我没有正确地添加用户,也没有正确地为他分配角色?

如果我用另一种方式来做,例如:

User user = new User("Иван");

Role role = serviceJpa.findRoleByRoleName("ROLE_USER");
user.addRole(role);
serviceJpa.saveUser(user);

然后发生另一个异常:

消息请求处理失败;嵌套异常为org.springframework.dao.InvalidDataAccessApiUsageException:已分离传递给持久化的实体:com.testmany.shop.entity.Role;嵌套的异常为org.hubinate.PersistentObjectException:分离的实体传递到持久化:com.testmany.entity.Role

我做错了什么?如何添加具有FetchType.LAZY的用户,即不具有FetchType.EAGER。添加用户并为其分配角色的正确方法是什么?我做错了什么。我已经复习并重读了一堆信息,hibernate文档,但没有任何帮助。你好吗,节目?

在您的用户模型中,按如下方式设置延迟获取:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "app_user_role", joinColumns = @JoinColumn(name = "userid"), inverseJoinColumns = @JoinColumn(name = "roleid"))
private List<Role> roles;

为了补偿延迟加载,在控制器中的某个位置初始化它,如下所示(只是为了给你提示(:

@ModelAttribute("roles")
public List<Role> initializeRoles() {
return (List<Role>) roleJPARepository.findAll();
}

然后,在代码的某个地方(比如服务(,将角色设置为用户,如下所示:

entity.setRoles(user.getRoles());

关于一个完整的例子,你可以通过UI将角色设置/编辑为用户,请参阅我的GitHub Repo-https://github.com/ajkr195/springbootrocks

这与你想要的非常接近。

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "user_role",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id")}
)
private List<RoleUser> roleUserList;

你可以试试这个,它可能对有帮助

最新更新