2016-04-03 72 views
0

我想开始我的web应用程序,但我得到异常:的UserDetails和休眠例外

java.util.Collection, at table: user, for columns: [org.hibernate.mapping.Column(authorities)] 

我很抱歉粘合代码,但SO需要更少的代码和更多的细节。

这是我的用户实体:

@Entity 
@Table(name = "user") 
public class User extends BaseEntity implements UserDetails { 
    private String email; 
    private String password; 
    private Set<Role> roles; 
    @Column(name = "email", nullable = false, unique = true) 
    public String getEmail() {return email;} 
    public void setEmail(String email) {this.email = email;} 
    @Column(name = "password", nullable = false) 
    public String getPassword() {return password;} 
    public void setPassword(String password) {this.password = password;} 
    @ManyToMany 
    @JoinTable(name = "user_role", 
      joinColumns = {@JoinColumn(name = "user", referencedColumnName = "id")}, 
      inverseJoinColumns = {@JoinColumn(name = "role", referencedColumnName = "name")}) 
    public Set<Role> getRoles() { return roles; } 
    public void setRoles(Set<Role> role) {this.roles = role;} 
    @Override 
    public Collection<? extends GrantedAuthority> getAuthorities() {return roles;} 
    @Override 
    public String getUsername() { return email; } 
    @Override 
    public boolean isAccountNonExpired() {return true; } 
    @Override 
    public boolean isAccountNonLocked() { return true; } 
    @Override 
    public boolean isCredentialsNonExpired() { return true; } 
    @Override 
    public boolean isEnabled() { return true; } 
} 

而且它的角色实体:

@Entity 
@Table(name = "Role") 
public class Role implements GrantedAuthority, Serializable { 
    private String name; 
    @Id 
    @Column(name = "name") 
    public String getName() {return name;} 
    public void setName(String name) { this.name = name; } 
    @Override 
    public String getAuthority() {return name;} 
} 
+0

在你的'User'类中,你有两个方法'getAuthorities(..)'和'getRoles(..)'都返回'roles'。你需要'getAutrhorities(..)'方法,也没有任何休眠'OneToMany'映射。你可能想删除它并尝试? –

+0

@MadhusudanaReddySunnapu好吧,我不能删除'getAuthorities()'方法,但我尝试返回'null',并且得到相同的异常 –

+0

这与它返回的内容无关。你可以在这个方法上添加'Transient'注释并尝试。 –

回答

1

我找到原因针对此问题。如果我们将注释放在getter之上,那么Hibernate会自动为其他未注释的getter创建列。有两种变体:

1)移动字段上方的所有注释。

2)将@Transient添加到不是列的所有getter。