我想創建一個使用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_UNIQUE
(USERS_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_ID
(ROLES_USERNAME
) 約束FK_ROLES_ID
外鍵(ROLES_USERNAME
)參考文獻users
(USERS_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;
}
}
請告訴我如何解決此問題。
我已經嘗試過了,得到同樣的結果。 :( –
我試過了:'List user = session.createQuery(「from Users as u,where u.usersUsername =:username」)。setParameter(「username」,name).list();'但是設置角色有空值。 –