2013-01-31 39 views
1

我想創建一個使用Spring,Hibernate和JSF的用戶管理系統。我創建了自己的Users類,它實現了java.io.Serializable,org.springframework.security.core.userdetails.UserDetails 和Roles類。hibernate持久集不填充一對多映射

我的問題是UserLoginDAOImpl類的方法loadUserByName(String name)不加載持久性角色集。

我使用Netbeans 7.3 beta IDE,Glassfish server 3+作爲web服務器。

這裏是調試快照。Here is the Debugging snapshot

這裏是HBM查詢的調試跟蹤:

INFO: Hibernate: select users0_.USERS_ID as USERS1_2_, users0_.USERS_USERNAME as USERS2_2_, users0_.USERS_PASSWORD as USERS3_2_, users0_.USERS_ENABLED as USERS4_2_, users0_.USERS_CREATED_DT as USERS5_2_, users0_.USERS_MODIFIED_DT as USERS6_2_, users0_.USERS_EMAIL as USERS7_2_ from ats.users users0_ where users0_.USERS_USERNAME='user' 
INFO: Hibernate: select roleses0_.ROLES_USERNAME as ROLES2_1_, roleses0_.ROLES_ID as ROLES1_1_, roleses0_.ROLES_ID as ROLES1_1_0_, roleses0_.ROLES_USERNAME as ROLES2_1_0_, roleses0_.ROLES_ROLE_NAME as ROLES3_1_0_, roleses0_.ROLES_CREATED_DT as ROLES4_1_0_, roleses0_.ROLES_MODIFIED_DT as ROLES5_1_0_ from ats.roles roleses0_ where roleses0_.ROLES_USERNAME=? 

用戶和角色表模式:

CREATE TABLE `users` (

USERS_ID INT(11)NOT NULL AUTO_INCREMENT, USERS_USERNAME varchar(45)NOT NULL, USERS_PASSWORD VARCHAR(255)NOT NULL, USERS_ENABLED VARCHAR(5)NOT NULL, USERS_CREATED_DT VARCHAR(45)NOT NULL, USERS_MODIFIED_DT VARCHAR(45)DEFAULT NULL, USERS_EMAIL VARCHAR(50)DEFAULT NULL, PRIMARY KEY(USERS_ID) , UNIQUE KEY USERS_USERNAME_UNIQUEUSERS_USERNAME) )ENGINE = InnoDB的AUTO_INCREMENT = 3默認字符集= UTF8 $$

CREATE TABLE `roles` (

ROLES_ID INT(11)NOT NULL AUTO_INCREMENT, ROLES_USERNAME VARCHAR(45)NOT NULL, ROLES_ROLE_NAME VARCHAR(45)NOT NULL, ROLES_CREATED_DT VARCHAR(45)NOT NULL, ROLES_MODIFIED_DT VARCHAR(45)DEFAULT NULL, PRIMARY KEY(ROLES_ID) KEY FK_ROLES_IDROLES_USERNAME) 約束FK_ROLES_ID外鍵(ROLES_USERNAME)參考文獻usersUSERS_USERNAME)ON DELETE NO ACTION ON UPDATE NO ACTION )ENGINE = InnoDB的AUTO_INCREMENT = 4默認字符集= UTF8 $$

這是我的DAOImpl類方法:

@Override 
public Users loadUserByName(String name) { 
    if (name != null && !name.equals("")) { 
       Session session=hibernateTemplate.getSessionFactory().openSession(); 
       Transaction transaction=null; 
       transaction=session.beginTransaction(); 

       List<Users> user=session.createQuery("from Users where usersUsername='"+name+"'").list(); 





        transaction.commit(); 
        if (user.size() == 1) { 


        return user.get(0); 
     } else { 
      return null; 
     } 
    } else { 
     return null; 
    } 
} 

Users.hbl.xml

<hibernate-mapping> 
<class name="com.ats.customer.model.Users" table="users" catalog="ats"> 
    <id name="usersId" type="java.lang.Integer"> 
     <column name="USERS_ID" /> 
     <generator class="native" /> 
    </id> 
    <property name="usersUsername" type="string"> 
     <column name="USERS_USERNAME" length="45" not-null="true" unique="true" /> 
    </property> 
    <property name="usersPassword" type="string"> 
     <column name="USERS_PASSWORD" not-null="true" /> 
    </property> 
    <property name="usersEnabled" type="string"> 
     <column name="USERS_ENABLED" length="5" not-null="true" /> 
    </property> 
    <property name="usersCreatedDt" type="string"> 
     <column name="USERS_CREATED_DT" length="45" not-null="true" /> 
    </property> 
    <property name="usersModifiedDt" type="string"> 
     <column name="USERS_MODIFIED_DT" length="45" /> 
    </property> 
    <property name="usersEmail" type="string"> 
     <column name="USERS_EMAIL" length="50" /> 
    </property> 
    <set name="roleses" table="roles" inverse="true" lazy="false" fetch="select"> 
     <key> 
      <column name="ROLES_USERNAME" not-null="true" /> 
     </key> 
     <one-to-many class="com.ats.customer.model.Roles" /> 
    </set> 
</class> 
    <sql-query name="getUserDetailsByUserNameProc"> 
<return alias="users" class="com.ats.customer.model.Users"/> 
<![CDATA[CALL getUserDetailsByUserName(:username)]]> 
</sql-query> 

Roles.hbl。XML

<hibernate-mapping> 
<class name="com.ats.customer.model.Roles" table="roles" catalog="ats"> 
    <id name="rolesId" type="java.lang.Integer"> 
     <column name="ROLES_ID" /> 
     <generator class="native" /> 
    </id> 
    <many-to-one name="users" class="com.ats.customer.model.Users" fetch="select"> 
     <column name="ROLES_USERNAME" not-null="true" /> 
    </many-to-one> 
    <property name="rolesRoleName" type="string"> 
     <column name="ROLES_ROLE_NAME" length="45" not-null="true" /> 
    </property> 
    <property name="rolesCreatedDt" type="string"> 
     <column name="ROLES_CREATED_DT" length="45" not-null="true" /> 
    </property> 
    <property name="rolesModifiedDt" type="string"> 
     <column name="ROLES_MODIFIED_DT" length="45" /> 
    </property> 
</class> 

用戶類:Users.java

public class Users implements java.io.Serializable,org.springframework.security.core.userdetails.UserDetails { 


private Integer usersId; 
private String usersUsername; 
private String usersPassword; 
private String usersEnabled; 
private String usersCreatedDt; 
private String usersModifiedDt; 
private String usersEmail; 
private Set<Roles> roleses = new HashSet(); 
//private GrantedAuthority[] authorities = null; 

public Users() { 
} 


public Users(String usersUsername, String usersPassword, String usersEnabled, String usersCreatedDt) { 
    this.usersUsername = usersUsername; 
    this.usersPassword = usersPassword; 
    this.usersEnabled = usersEnabled; 
    this.usersCreatedDt = usersCreatedDt; 
} 
public Users(String usersUsername, String usersPassword, String usersEnabled, String usersCreatedDt, String usersModifiedDt, String usersEmail, Set<Roles> roleses) { 
    this.usersUsername = usersUsername; 
    this.usersPassword = usersPassword; 
    this.usersEnabled = usersEnabled; 
    this.usersCreatedDt = usersCreatedDt; 
    this.usersModifiedDt = usersModifiedDt; 
    this.usersEmail = usersEmail; 
    this.roleses = roleses; 
} 

public Integer getUsersId() { 
    return this.usersId; 
} 

public void setUsersId(Integer usersId) { 
    this.usersId = usersId; 
} 
public String getUsersUsername() { 
    return this.usersUsername; 
} 

public void setUsersUsername(String usersUsername) { 
    this.usersUsername = usersUsername; 
} 
public String getUsersPassword() { 
    return this.usersPassword; 
} 

public void setUsersPassword(String usersPassword) { 
    this.usersPassword = usersPassword; 
} 
public String getUsersEnabled() { 
    return this.usersEnabled; 
} 

public void setUsersEnabled(String usersEnabled) { 
    this.usersEnabled = usersEnabled; 
} 
public String getUsersCreatedDt() { 
    return this.usersCreatedDt; 
} 

public void setUsersCreatedDt(String usersCreatedDt) { 
    this.usersCreatedDt = usersCreatedDt; 
} 
public String getUsersModifiedDt() { 
    return this.usersModifiedDt; 
} 

public void setUsersModifiedDt(String usersModifiedDt) { 
    this.usersModifiedDt = usersModifiedDt; 
} 
public String getUsersEmail() { 
    return this.usersEmail; 
} 

public void setUsersEmail(String usersEmail) { 
    this.usersEmail = usersEmail; 
} 
public Set<Roles> getRoleses() { 
    return this.roleses; 
} 

public void setRoleses(Set<Roles> roleses) { 
    this.roleses = roleses; 
} 

@Override 
public String getPassword() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public String getUsername() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public boolean isAccountNonExpired() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public boolean isAccountNonLocked() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public boolean isCredentialsNonExpired() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public boolean isEnabled() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

@Override 
public Collection<? extends GrantedAuthority> getAuthorities() { 
    throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
} 

}

Roles類:Roles.java

public class Roles implements java.io.Serializable { 


private Integer rolesId; 
private Users users; 
private String rolesRoleName; 
private String rolesCreatedDt; 
private String rolesModifiedDt; 

public Roles() { 
} 


public Roles(Users users, String rolesRoleName, String rolesCreatedDt) { 
    this.users = users; 
    this.rolesRoleName = rolesRoleName; 
    this.rolesCreatedDt = rolesCreatedDt; 
} 
public Roles(Users users, String rolesRoleName, String rolesCreatedDt, String rolesModifiedDt) { 
    this.users = users; 
    this.rolesRoleName = rolesRoleName; 
    this.rolesCreatedDt = rolesCreatedDt; 
    this.rolesModifiedDt = rolesModifiedDt; 
} 

public Integer getRolesId() { 
    return this.rolesId; 
} 

public void setRolesId(Integer rolesId) { 
    this.rolesId = rolesId; 
} 
public Users getUsers() { 
    return this.users; 
} 

public void setUsers(Users users) { 
    this.users = users; 
} 
public String getRolesRoleName() { 
    return this.rolesRoleName; 
} 

public void setRolesRoleName(String rolesRoleName) { 
    this.rolesRoleName = rolesRoleName; 
} 
public String getRolesCreatedDt() { 
    return this.rolesCreatedDt; 
} 

public void setRolesCreatedDt(String rolesCreatedDt) { 
    this.rolesCreatedDt = rolesCreatedDt; 
} 
public String getRolesModifiedDt() { 
    return this.rolesModifiedDt; 
} 

public void setRolesModifiedDt(String rolesModifiedDt) { 
    this.rolesModifiedDt = rolesModifiedDt; 
} 

}

請告訴我如何解決此問題。

回答

0

在DAO類的嘗試:

List<Users> user= 
    session.createQuery("from Users u where u.usersUsername= :username") 
    .setParameter("username", name).list(); 
+0

我已經嘗試過了,得到同樣的結果。 :( –

+0

我試過了:'List user = session.createQuery(「from Users as u,where u.usersUsername =:username」)。setParameter(「username」,name).list();'但是設置角色有空值。 –