org.hibernate.MappingException:无法确定的类型:java.util.Set

org.hibernate.MappingException:无法确定的类型:java.util.Set,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,虽然这个问题被问了很多次,我已经使用了所有的建议,但我还是得到了这个错误 java是 @Entity @Table(name = "USER") public class User implements UserDetails, Serializable { private static final long serialVersionUID = 2L; @Id @Column(name = "USER_ID") @GeneratedValue(strateg

虽然这个问题被问了很多次,我已经使用了所有的建议,但我还是得到了这个错误

java是

@Entity
@Table(name = "USER")
public class User implements UserDetails, Serializable {

    private static final long serialVersionUID = 2L;

    @Id
    @Column(name = "USER_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name = "USERNAME")
    private String username;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "NAME")
    private String name;
    @Column(name = "EMAIL")
    private String email;
    @Column(name = "LOCKED")
    private boolean locked;
    @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
    @ElementCollection(targetClass=Role.class)
    @Column(name = "ROLE_ID")
    private Set<Role> roles;

    @Override
    public GrantedAuthority[] getAuthorities() {
        List<GrantedAuthorityImpl> list = new ArrayList<GrantedAuthorityImpl>(0);
        for (Role role : roles) {
            list.add(new GrantedAuthorityImpl(role.getRole()));
        }
        return (GrantedAuthority[]) list.toArray(new GrantedAuthority[list.size()]);
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return !isLocked();
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isLocked() {
        return locked;
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    public Set<Role> getRoles() {
        return roles;
    }
}
这是我第一次尝试使用JPA进行hibernate注释。因此,任何建议都将非常有用

对于hibernate,pom.xml的依赖项是:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.5.4-Final</version>
        <type>pom</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>3.1.0.GA</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.5.4-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

org.hibernate
冬眠
3.5.4-最终版本
聚甲醛
编译
org.hibernate
休眠注释
3.5.4-最终版本
罐子
编译
org.hibernate
冬眠核心
3.5.4-最终版本
罐子
编译
org.hibernate
休眠验证器
3.1.0.GA
罐子
编译
org.hibernate
休眠实体管理器
3.5.4-最终版本
罐子
编译
我对故障一无所知


谢谢。

我猜您正在使用
用户
类中的
集合
,并用
@OneToMany
注释。这意味着一个
用户
拥有多个
角色。但是在同一个字段上,您使用的是
@列
注释,这毫无意义。一对多关系使用单独的联接表或多端的联接列(在本例中为角色类)进行管理。使用
@JoinColumn
而不是
@Column
可能会解决这个问题,但在语义上似乎是错误的。我想角色和用户之间的关系应该是多对多。

不是说映射正确或错误,而是我认为hibernate想要一个声明字段的集合实例

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
//@ElementCollection(targetClass=Role.class)
@Column(name = "ROLE_ID")
private Set<Role> roles = new HashSet<Role>();
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
//@ElementCollection(targetClass=Role.class)
@列(name=“ROLE\u ID”)
私有集角色=新HashSet();
解决方案:

@Entity
@Table(name = "USER")
@Access(AccessType.FIELD)
public class User implements UserDetails, Serializable {

    private static final long serialVersionUID = 2L;

    @Id
    @Column(name = "USER_ID", updatable=false, nullable=false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "USERNAME")
    private String username;

    @Column(name = "PASSWORD")
    private String password;

    @Column(name = "NAME")
    private String name;

    @Column(name = "EMAIL")
    private String email;

    @Column(name = "LOCKED")
    private boolean locked;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = Role.class)
    @JoinTable(name = "USER_ROLE", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private Set<Role> roles;

    @Override
    public GrantedAuthority[] getAuthorities() {
        List<GrantedAuthorityImpl> list = new ArrayList<GrantedAuthorityImpl>(0);
        for (Role role : roles) {
            list.add(new GrantedAuthorityImpl(role.getRole()));
        }
        return (GrantedAuthority[]) list.toArray(new GrantedAuthority[list.size()]);
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return !isLocked();
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    @Override
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isLocked() {
        return locked;
    }

    public void setLocked(boolean locked) {
        this.locked = locked;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}
@实体
@表(name=“USER”)
@访问权限(AccessType.FIELD)
公共类用户实现UserDetails,可序列化{
私有静态最终长serialVersionUID=2L;
@身份证
@列(name=“USER\u ID”,updateable=false,nullable=false)
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“USERNAME”)
私有字符串用户名;
@列(name=“PASSWORD”)
私有字符串密码;
@列(name=“name”)
私有字符串名称;
@列(name=“EMAIL”)
私人字符串电子邮件;
@列(name=“LOCKED”)
私有布尔锁;
@OneToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER,targetEntity=Role.class)
@JoinTable(name=“USER\u ROLE”,joinColumns={@JoinColumn(name=“USER\u ID”)},inverseJoinColumns={@JoinColumn(name=“ROLE\u ID”)})
私人设定角色;
@凌驾
公共授权机构[]获取授权机构(){
列表列表=新的ArrayList(0);
for(角色:角色){
添加(新的GrantedAuthorityImpl(role.getRole());
}
return(GrantedAuthority[])list.toArray(newgrantedAuthority[list.size()]);
}
@凌驾
公共布尔值IsAccountNoExpired(){
返回true;
}
@凌驾
公共布尔值isAccountNonLocked(){
return!isLocked();
}
@凌驾
公共布尔值isCredentialsNonExpired(){
返回true;
}
@凌驾
公共布尔值isEnabled(){
返回true;
}
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@凌驾
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
@凌驾
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
公共布尔值isLocked(){
返回锁定;
}
public void setLocked(布尔锁定){
this.locked=locked;
}
公共集getRoles(){
返回角色;
}
公共无效集合角色(集合角色){
this.roles=角色;
}
}

Role.java同上。

@ElementCollection
添加到列表字段解决了此问题:

@Column
@ElementCollection(targetClass=Integer.class)
private List<Integer> countries;
@列
@ElementCollection(targetClass=Integer.class)
私人名单国家;

我在
@ManyToOne
专栏中遇到了同样的问题。它被解决了。。。以愚蠢的方式。我有公共getter方法的所有其他注释,因为它们是从父类重写的。但最后一个字段是为私有变量注释的,就像我的项目中的所有其他类一样。因此,我得到了相同的
MappingException
,没有任何原因


解决方案:我将所有注释放在公共getter方法中。我想,当私有字段和公共getter的注释混合在一个类中时,Hibernate无法处理这种情况。

您可能只需要在角色上添加
@Transient
注释就可以不序列化集合


我遇到了一个类似的问题,我在类中得到一个未映射到db列的成员的错误,它只是另一个实体列表的持有者。我将列表更改为ArrayList,错误消失了。我知道,我真的不应该在映射实体中这样做,这就是DTO的用途。我只是想与大家分享一下,以防有人发现这条线索,而上面的答案不适用或没有帮助。

就在今天出现了这个问题,我发现我无意中遗漏了@JoinTable注释上方的@manytomy注释

我也有类似的问题,我发现问题在于我混合了注释,其中一些注释位于属性之上,一些注释位于公共方法之上。我只是把它们都放在属性之上
@Column
@ElementCollection(targetClass=Integer.class)
private List<Integer> countries;