我遇到了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;
.
.
.
}
的UserRole
@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);
答案 0 :(得分:0)
Session.update
使分离的对象持久化(意味着Hibernate会话的对象版本现在反映了这些更改)。因此,如果你传入一个你没有从当前的Hibernate会话中获得的对象(可能是在Http会话中出现的东西或者你刚用new
创建的东西),那么该对象可能没有到它的链接UserRole,当你调用update
时,Hibernate认为因为缺少该引用意味着你要告诉它删除UserRole。
猜测您正在使用具有Id但已从会话中分离的现有用户:尝试使用该用户的ID调用Session.load以获取新的附加用户(因此它将是最新的,包括拥有现有的UserRole),然后对该对象进行所需的更改,然后让它被提交。应保留UserRole。