我想创建一个使用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();'但是设置角色有空值。 –