org.hibernate.MappingException:无法确定的类型:java.util.Set
虽然这个问题被问了很多次,我已经使用了所有的建议,但我还是得到了这个错误 java是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
@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;