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

虽然这个问题问了很多次,我已经使用了所有的build议,但我仍然得到这个错误。

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; } } 

而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; } } 

这是我第一次尝试用JPA进行hibernate注释。 所以任何build议都会非常有帮助。

对于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> 

我对这个错误一无所知。

谢谢。

我在@ManyToOne列中遇到了同样的问题。 它以愚蠢的方式解决了。 我有公开的getter方法的所有其他注释,因为它们被父类覆盖。 但是最后一个字段被注释为私有variables,就像我的项目中的所有其他类一样。 所以我没有理由得到相同的MappingException

解决scheme:我把所有的注释放在公共的getter方法中。 我想,当私人领域的注解和公共getter在一个类中混合时,Hibernate不能处理案例。

@ElementCollection添加到List字段解决了这个问题:

 @Column @ElementCollection(targetClass=Integer.class) private List<Integer> countries; 

我的猜测是你正在用@OneToMany注解的User类中使用Set<Role> 。 这意味着一个User有很多Role 。 但是在同一个字段中使用@Column注释是没有意义的。 一对多关系在多方面使用单独的连接表或连接列进行pipe理,在这种情况下,这将是Role类。 使用@JoinColumn而不是@Column可能会解决这个问题,但它在语义上似乎是错误的。 我想angular色和用户之间的关系应该是多对多的。

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

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

解:

 @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; } } 

Role.java与上面相同。

今天有这个问题,发现我无意中遗漏了@JoinTable注释上面的@ManyToMany注释。

我有类似的问题,我发现问题我混合注释上面的属性之上,其中一些以上的公共方法。 我只是把他们所有的属性,它的工作原理。

我有一个类似的问题,我得到一个错误的类未被映射到数据库列的成员,它只是一个持有人的另一个实体的列表。 我改变列表ArrayList和错误消失。 我知道,我真的不应该在一个映射的实体中这样做,这就是DTO的目的。 只是想分享的情况下,有人发现这个线程和上面的答案不适用或帮助。

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

为什么Java有瞬态字段?