2012-07-31 41 views
0

我只需要弄清楚爲什麼我的集合中的角色不會在保存(添加)後填充成員屬性。我有兩個表,用戶和角色,以及連接表UserRole。Hibernate:保存多對多連接後,集合不重新填充

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表只包括兩列,用戶id它映射的id User和roleId,它映射到Role中的id。

我使用名稱,密碼和一組角色傳遞User對象。此列表中的每個角色只有id填充。 UserRole表得到正確保存,但我希望保存後,我的用戶對象中的設置將具有權限和名稱屬性填充。

這些屬性在普通的'get'用戶中使用相同的映射填充,我希望它會在'保存'後做同樣的事情。

回答

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); 
} 
+0

感謝,還不如做這種方式。 – FrancisWebDev 2012-07-31 13:09:17