多对多/多列+弹簧形式绑定

时间:2014-11-10 19:42:23

标签: hibernate spring-mvc jpa

我搜索过高和低,但找不到答案:我正在尝试使用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的角色,审核列是否通过监听器填充?任何想法都表示赞赏!

感谢。

0 个答案:

没有答案