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

Tap*_*ose 79 java annotations hibernate jpa

虽然这个问题多次询问,但我已经使用了所有的建议,但我仍然遇到了这个错误.

User.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;
    }
}
Run Code Online (Sandbox Code Playgroud)

而Role.java是

@Entity
@Table(name="ROLE")
public class Role implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="ROLE_ID")
    private long id;
    @Column(name="USERNAME")
    private String username;
    @Column(name="ROLE")
    private String role;


    public long getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

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

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我第一次尝试使用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>
Run Code Online (Sandbox Code Playgroud)

我对这个错误一无所知.

谢谢.

小智 79

我的@ManyToOne列遇到了同样的问题.它以愚蠢的方式解决了.我有公共getter方法的所有其他注释,因为它们是从父类重写的.但是,在我的项目中的所有其他类中,最后一个字段都被注释为私有变量.所以我MappingException没有理由得到同样的东西.

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


Big*_*va2 46

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

@Column
@ElementCollection(targetClass=Integer.class)
private List<Integer> countries;
Run Code Online (Sandbox Code Playgroud)

  • 什么?这与问题无关. (2认同)

whi*_*rra 15

我的猜测是你正在使用带注释Set<Role>User@OneToMany.这意味着一个人User有很多Role.但是在同一个领域你使用的@Column注释是没有意义的.在多方面使用单独的连接表或连接列来管理一对多关系,在这种情况下,它们将是Role类.使用@JoinColumn而不是@Column可能解决问题,但似乎在语义错误.我猜角色和用户之间的关系应该是多对多的.


Mar*_*ark 7

就在今天才发生此问题,发现我无意中忽略了@JoinTable批注上方的@ManyToMany批注。


Kon*_*tin 5

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

@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER)
//@ElementCollection(targetClass=Role.class)
@Column(name = "ROLE_ID")
private Set<Role> roles = new HashSet<Role>();
Run Code Online (Sandbox Code Playgroud)

  • 不需要在角色集中使用@ElementCollection,因为角色是一个实体。在这种情况下,您只能使用 @ManyToOne。JPA 2.0 规范明确指出 @EllementCollection 用于基本类型和可嵌入的。此外,您必须使用@JoinColumn 而不是@Column 指定列信息。后者将与@ElementCollection 一起使用,但不能与@ManyToOne 一起使用。 (2认同)

Tap*_*ose 5

解:

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Role.java与上面相同.

  • 如果你告诉需要改变什么(并解释原因)而不是发布完整代码会好得多.人们必须逐行比较两个文件才能找到差异. (73认同)
  • 比较这些文件,我发现了以下不同之处:1.他将@Access(AccessType.FIELD)添加到了类2.集合<Role>角色的@ElementColection已被@JoinTable(...)替换 (22认同)

小智 5

我遇到了类似的问题,我发现我将注释混合在一起,其中一些在属性之上,而另一些在公共方法之上。我只是将所有这些都放在属性之上,并且它有效。