0

保存(追加)した後、ロールのコレクションがメンバーのプロパティに入力されない理由を理解する必要があります。UserとRoleの2つのテーブルと、結合テーブル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

そしてこれが私のHibernateXMLマッピングです

<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テーブルは、UserのIDにマップするuserIdとRoleのIDにマップするroleIdの2つの列のみで構成されています。

名前、パスワード、およびロールのセットを含むUserオブジェクトを渡します。このリストの各ロールには、IDのみが入力されています。UserRoleテーブルは適切に保存されますが、保存後、UserオブジェクトのSetに権限と名前の属性が入力されるようにしたいと思います。

これらのプロパティは、同じマッピングを使用する通常の「get」ユーザーに入力されます。「保存」を実行した後も同じように実行されることを期待していました。

4

1 に答える 1

0

hibernateはそれを行いません。基本的にここには壊れたモデルがあり、hibernateはパスワードが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 に答える