0

我在使用 spring hibernate 时遇到问题,当我更新用户时,这会删除关联的角色……这可能是级联问题吗?我已经尝试过各种级联配置......

@MappedSuperclass
public abstract class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column
    private int id;

    @OneToOne(cascade = { CascadeType.ALL }  )
    @JoinTable(name="user_roles",  
        joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")},  
        inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}  
    )
.
.
.
}

角色

@Entity  
@Table(name="roles")  
public class Role {  

    @Id  
    @GeneratedValue  
    private Integer id;  

    private String authority;  

    @OneToMany(cascade = CascadeType.ALL ) 
    @JoinTable(name="user_roles",   
        joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")},  
        inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}  
    )
    private Set<User> userRoles;
.
.
.
}

用户角色

@Entity
@Table (name = "user_roles")
public class UserRole {
    @Id
    @Column(name = "user_id")
    private int userId;

    @Column(name = "role_id")
    private int roleId;
.
.
.
}

UserDaoImpl

@Override
    public void updateUser(User user) {
        try {
            this.sessionFactory.getCurrentSession().update(user);
        } catch (HibernateException e) {
            System.out.println(e);
        }
    }

我得到这样的用户(已登录的用户):

@RequestMapping(value = "/edit/", method = RequestMethod.GET)
    public String editUser(ModelMap map,Principal principal) {
        try{
            //Get logged in username
            String loggedUserEmail = principal.getName();
            User user = userService.getUserByEmail(loggedUserEmail);

            map.addAttribute("user", user);

        } catch(Exception e) {
            log.error("/user/edit/---"+e);
        }


        return "forms/userForm";
    }

然后我在用户表单上提交一些更改后尝试更新。

啊,我像这样插入 UserRole:

//Add userRole to db
            UserRole userRole = new UserRole();
            userRole.setUserId(user.getId());
            userRole.setRoleId(1);
            userRoleService.addUserRole(userRole);
4

1 回答 1

0

Session.update使分离的对象持久化(意味着 Hibernate 会话的对象版本现在反映了这些更改)。因此,如果您传入一个不是从当前 Hibernate 会话中获得的对象(可能是在 Http 会话中挂起的东西或您刚刚创建的东西new),那么该对象可能没有指向其 UserRole 的链接,并且当您call updateHibernate 认为,因为缺少该引用,这意味着您正在告诉它删除 UserRole。

猜测您正在使用具有 Id 但与会话分离的现有用户:尝试使用该用户的 id 调用 Session.load 以获取新的附加用户(因此它将是最新的,包括拥有现有的 UserRole),然后对该对象进行所需的更改,然后提交。应保留 UserRole。

于 2013-09-30T14:51:48.717 回答