我搜索过高和低,但找不到答案:我正在尝试使用spring MVC通过表单保存ManyToMany实体(包含审计列)。我为长篇文章道歉,但希望尽可能多地包含信息。我有3个实体,User,UserRole,Role,我想通过表单更新UserRole关系:
用户:
@Entity
@Table
public class User extends AuditableEntity {
@OneToMany(mappedBy="user", cascade={CascadeType.ALL})
private Set<UserRole> roles = new LinkedHashSet<UserRole>();
}
UserRole:请注意 AuditableEntity !
@Entity
@Table
@IdClass(RoleId.class)
public class UserRole extends AuditableEntity {
@Id
@ManyToOne
@JoinColumn(name="USER_ID", referencedColumnName="ID")
private User user;
@Id
@ManyToOne
@JoinColumn(name="ROLE_ID", referencedColumnName="ID")
private Role role;
}
作用:
@Entity
@Table
public class Role extends AuditableEntity {
@Id
@Column
private Integer id;
@Column
private String name;
}
非常简单,对吧?所有3个表都扩展了一个AuditableEntity,它有一个监听器设置为自动填充由/更新创建/更新和创建的日期。
我遇到的问题是我不能为我的生活UPDATE UserRole对象。我已经通过弹簧形式设置了一个复选框列表:
<form:checkboxes path="user.roles"
items="${roles}"
itemLabel="name"
label="Roles"
itemValue="id" />
我尝试创建转换器以将角色ID转换为UserRole
个对象:
public class UserRoleConverter implements Converter<String, UserRole> {
private RoleManager roleManager;
public UserRoleConverter(RoleManager roleManager) {
this.roleManager = roleManager;
}
@Override
public UserRole convert(String source) {
Role role = roleManager.findOne(Integer.valueOf(source));
UserRole userRole = new UserRole();
userRole.setRole(role);
return userRole;
}
}
,当用户没有任何角色时,这可以正常工作。但是,在更新用户的角色时,我得到一个NULL SQL错误,因为它将代理的UserRole(来自数据库)与转换器创建的UserRole重叠。 Hibernate将此视为更新的对象,而不是新对象,因此它会跳过审计侦听器以设置创建日期的时间戳。此外,我不确定如何通过此方法删除角色。
有没有办法简单地映射用户 - &gt;通过@ManyToMany的角色,审核列是否通过监听器填充?任何想法都表示赞赏!
感谢。