0

我只需要弄清楚为什么我的角色集合在保存(添加)后不会填充成员属性。我有两个表,用户和角色,以及连接表 UserRole。

public class User implements Serializable {
private int id;
@NotBlank(message = "{User.userName.notBlank}")
@AlphaNumeric(message = "{User.userName.alphaNumeric}")
private String name;
@NotBlank(message = "{User.password.notBlank}")
@AlphaNumeric(message = "{User.password.alphaNumeric}")
private String password;
private boolean enabled;
private boolean deleteSafe; 
@NotEmpty(message="{User.roles.notEmpty}")

private Set<Role> roles; <-- this is my problem

这是我的 Hibernate XML 映射

<class name="User">
    <id name="id">
        <generator class="identity" />
    </id>
    <property name="name"></property>
    <property name="password"></property>
    <set name="roles" table="UserRoles" lazy="false">
        <key column="userId"></key>
        <many-to-many column="roleId" class="Role"></many-to-many>
    </set>
</class>

这是简单的角色类

public class Role implements Serializable {
private int id; 
private String authority;
private String name;

我的 UserRole 表只包含两列,userId 映射到 User 的 id,roleId 映射到 Role 中的 id。

我传递了一个带有名称、密码和一组角色的用户对象。此列表中的每个角色仅填充了 id。UserRole 表已正确保存,但我希望在保存后,我的 User 对象中的 Set 将填充权限和名称属性。

这些属性使用相同的映射填充在普通的“获取”用户中,我希望它在“保存”后会做同样的事情。

4

1 回答 1

0

休眠不会那样做。您基本上在这里有一个损坏的模型,并且休眠无法区分密码设置为 null 的角色和您希望它填充的虚拟角色。如果您只想将具有已知 ID 的角色分配给新创建的用户,请使用 session.load()。

for(long roleId : roleIds)
{
    newUser.getRoles().add(session.load(Role.class, roleId));
}

session.Load 返回的角色是代理,在访问它们之前不会生成往返。

更新:如果您知道以后需要这些角色,那么急切加载它们会更好

for(Role role : session.CreateCriteria(Role.class).add(Expression.in("id", roleIds)).list())
{
    newUser.getRoles().add(role);
}
于 2012-07-31T11:59:06.150 回答