2011-12-16 221 views
0

我使用弹簧3 +弹簧安全3 +休眠。 我有一些映射类的问题。我不知道为什么,但是一些类被映射了,它们可以被Hibernate使用,但同时一些(用于Spring Security)不是这样! 论坛-security.xml文件:休眠+弹簧安全

<beans:beans xmlns="http://www.springframework.org/schema/security" 
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 
<http auto-config='true'> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
</http> 
<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"/> 
</authentication-manager> 
</beans:beans> 

UserServiceImpl:

package forum.service; 
import java.util.List; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.core.userdetails.User; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import forum.domain.ForumUser; 

@Service 
public class UserServiceImpl implements UserService{ 
    @Autowired private SessionFactory sessionFactory; 
@Autowired private Assembler assembler; 
public List<ForumUser> listAllUsers(){ 
    return null; 
} 
public List<ForumUser> listUsersBySellingPont(){ 
    return null; 
} 
@Transactional 
public ForumUser getUserByUsername(String username){ 
    Session session = sessionFactory.getCurrentSession(); 
    List<ForumUser> users = session.createQuery("from ForumUser").list(); 
    ForumUser result = null; 
    for(ForumUser user : users){ 
     if(user.getUsername().equals(username)) 
      result = user; 
    } 
    return result; 
} 
public void addUser(ForumUser user){ 

} 
public void updateUser(ForumUser user){ 

} 
public void deleteUser(Integer id){ 

} 
} 

汇编:不受休眠映射(其他类映射)

package forum.service; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import org.springframework.security.core.GrantedAuthority; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import forum.domain.ForumUser; 
import forum.domain.UserDetailsImpl; 

@Service("assembler") 
public class Assembler { 
@Transactional(readOnly = true) 
    UserDetailsImpl buildUserFromUserEntity(ForumUser userEntity) { 
    Integer id = userEntity.getId(); 
    String username = userEntity.getUsername(); 
    String password = userEntity.getPassword(); 
    String email = userEntity.getEmail(); 
    Date enabled = userEntity.getEnabled(); 
    Date lastEntered = userEntity.getLastEntered(); 
    Date registered = userEntity.getRegistered(); 

    List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
    for (GrantedAuthority role : userEntity.getAuthorities()) { 
     authorities.add(role); 
    } 
    UserDetailsImpl user = new UserDetailsImpl(); 
    user.setId(id); 
    user.setUsername(username); 
    user.setPassword(password); 
    user.setEmail(email); 
    user.setEnabled(enabled); 
    user.setAuthorities(authorities); 
    user.setLastEntered(lastEntered); 
    user.setRegistered(registered); 
    return user; 
    } 
} 

现在类:

package forum.domain; 

import java.util.Date; 
import java.util.List; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.OneToMany; 
import javax.persistence.Table; 
import javax.persistence.FetchType; 
import javax.persistence.CascadeType; 

import org.springframework.security.core.GrantedAuthority; 

@Entity 
@Table(name="users") 
public class ForumUser { 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="id") 
private Integer id; 
@Column(name="username") 
private String username; 
@Column(name="password") 
private String password; 
@Column(name="email") 
private String email; 
@Column(name="registered") 
private Date registered; 
@Column(name="lastEntered") 
private Date lastEntered; 
@Column(name="enabled") 
private Date enabled; 
@OneToMany(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY,mappedBy="forumUser") 
private List<GrantedAuthority> authorities; 
public Date getEnabled(){ 
    return enabled; 
} 
public void setEnabled(Date enabled){ 
    this.enabled = enabled; 
} 
public Integer getId(){ 
    return id; 
} 
public void setId(Integer id){ 
    this.id = id; 
} 
public String getUsername(){ 
    return username; 
} 
public void setUsername(String username){ 
    this.username = username; 
} 
public String getPassword(){ 
    return password; 
} 
public void setPassword(String password){ 
    this.password = password; 
} 
public String getEmail(){ 
    return email; 
} 
public void setEmail(String email){ 
    this.email = email; 
} 
public Date getRegistered(){ 
    return registered; 
} 
public void setRegistered(Date registered){ 
    this.registered = registered; 
} 
public Date getLastEntered(){ 
    return lastEntered; 
} 
public void setLastEntered(Date lastEntered){ 
    this.lastEntered = lastEntered; 
} 
public List<GrantedAuthority> getAuthorities() { 
    return authorities; 
} 
public void setAuthorities(List<GrantedAuthority> authorities){ 
    this.authorities = authorities; 
} 
} 

而第二类:

package forum.domain; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.FetchType; 
import javax.persistence.ManyToOne; 
import javax.persistence.CascadeType; 
import javax.persistence.JoinColumn; 
import javax.persistence.Table; 

import org.springframework.security.core.GrantedAuthority; 

@Entity 
@Table(name="authorities") 
public class Authority implements GrantedAuthority{ 
@ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.LAZY) 
@JoinColumn(name="userId") 
private ForumUser forumUser; 
@Column(name="authority") 
private String authority; 
public String getAuthority() { 
    return authority; 
} 
public void setAuthority(String authority) { 
    this.authority = authority; 
} 
} 

所以,当我试图通过用户名从(从ForumUser UserServiceImpl.getUserByUsername())DB检索的用户,它抛出 org.hibernate.hql.ast.QuerySyntaxException:ForumUser是不是映射[来自ForumUser]

如果我改变你的HQL到另一个,例如“从论坛”(这是另一个类,这是工作)它会抛出另一个异常,什么都不重要,但事实是它映射另一个类并可以检索它。 我该如何解决这个问题?

+0

它看起来像休眠关联问题:请发布主题休眠/关联配置。 – Ralph 2011-12-17 08:18:58

回答

0

哦,我找到了解决方案!这一切都是因为我自己不注意。我忘记了将新类添加到我的conf中已注释的持久化类的列表中。

+0

也许你应该删除这个问题,或者至少减少mahoosive代码示例。 – Cheekysoft 2011-12-19 13:32:28