java - Hibernate删除关系manyToMany

标签 java spring hibernate jakarta-ee

我有 3 个表 Role、User 和 UserRole。表 UserRole 包含用户和角色之间的映射以及两个相应的索引列。我正在使用带注释的 hibernate ,并且希望能够“撤销”用户的角色,但这变得有些困难。

在我的用户类中,我有

@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, targetEntity = Role.class)
    @IndexColumn(name = "role_index", base = 0)
    @NotFound(action=NotFoundAction.IGNORE)
    @JoinTable(name = "tblUser_Role", joinColumns={
    @JoinColumn(name = "UID")}, inverseJoinColumns={
    @JoinColumn(name = "roleid", nullable = false)})
    private List<Role> roles = new ArrayList<Role>(0);

在我的角色类中,我有

@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy="roles")
    private List<User> users = new ArrayList<User>(0);

我调用“撤销”角色的 DAO 方法是

@Override
    public boolean revokeRolesFromUserAccount(User user, List<Role> userRoles) {
        if (log.isInfoEnabled()) {
            log.info("Roles revoked from the User " + user.getUsername());
        }
        if (user == null) {
            return false;
        }
        if (userRoles == null) {
            return false;
        }

        Iterator<Role> iter = userRoles.iterator();
        List<Role> newroles = new ArrayList<Role>(0);
        Role role = null;
        while (iter.hasNext()) {
            role = (Role) this.sessionFactory.getCurrentSession().load(
                    Role.class, iter.next().getRoleid());
            newroles.add(role);
        }

        User newUser = null;
        newUser = (User) this.sessionFactory.getCurrentSession().load(User.class, user.getUid());
        newUser.getRoles().removeAll(newroles);
        this.sessionFactory.getCurrentSession().saveOrUpdate(newUser);
        return true;

    }

由于某种原因,这不能按预期工作,当突破时,我注意到角色没有被初始化,我猜是由于 LazyLoading,我尝试做类似 Hibernate.initialize(newUser.getRoles()) 的事情 但这并没有改变任何东西。我仍在学习 hibernate 的诀窍,不确定我错过了什么,也许是一些非常明显的东西?非常感谢您提前投入的时间和想法!

更新:在尝试了 Paujo 和 Matin Kh 建议的修复并进行进一步调试后,我仍然没有看到在 newUser = (User) this.sessionFactory.getCurrentSession() 行之后加载的角色有任何差异。 load(User.class, user.getUid());

这是我的 tblUser_Role 的副本,不确定这是否有帮助。再次感谢!

(添加角色效果很好)

enter image description here

最佳答案

我这里的情况就是这样。您的问题有一个非常简单的解决方案。

对于其中一个类,请使用 EAGER,而对于另一个类,请使用 LAZY。试试这个:

角色:

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

用户:

@ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, targetEntity = Role.class)
@IndexColumn(name = "role_index", base = 0)
@NotFound(action=NotFoundAction.IGNORE)
@JoinTable(name = "tblUser_Role", joinColumns={
@JoinColumn(name = "UID")}, inverseJoinColumns={
@JoinColumn(name = "roleid", nullable = false)})
private List<Role> roles = new ArrayList<Role>(0);

关于java - Hibernate删除关系manyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12222291/

相关文章:

java - 如何防止@ModelAttribute 在方法中实例化日历

java - 我的 Spring 应用程序无法识别我的网络服务

Hibernate 不在一对多关系中插入列

JBoss 中的 java.lang.NoSuchMethodError : org. jboss.logging.Logger.getMessageLogger

sql-server - 2017 年的 Hibernate 方言版 MSSQL

java - Jooq 中替代的 SQL DATE_FORMAT

java - 电话经理的值(value)观是否可靠且多变(cdma)?

java - 当单击其中一列中的按钮时,Jtable 丢失多行选择

java - TTP 状态 500 - 实例化 servlet 类时出错 com.zestedesavoir.servlets.Test>

java - Spring HATEOAS 1.x 上的 ResourceSupport.getId()