org.hibernate.MappingException: Impossible de déterminer le type pour: java.util.Set

Bien que cette question ait été posée à plusieurs resockets et que j’ai déjà utilisé toutes les suggestions, je reçois toujours cette erreur.

L’utilisateur.java est

@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 Ssortingng username; @Column(name = "PASSWORD") private Ssortingng password; @Column(name = "NAME") private Ssortingng name; @Column(name = "EMAIL") private Ssortingng email; @Column(name = "LOCKED") private boolean locked; @OneToMany(cascade=CascadeType.ALL, fetch = FetchType.EAGER) @ElementCollection(targetClass=Role.class) @Column(name = "ROLE_ID") private Set roles; @Override public GrantedAuthority[] getAuthorities() { List list = new ArrayList(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 Ssortingng getName() { return name; } public void setName(Ssortingng name) { this.name = name; } public Ssortingng getEmail() { return email; } public void setEmail(Ssortingng email) { this.email = email; } public boolean isLocked() { return locked; } public void setLocked(boolean locked) { this.locked = locked; } @Override public Ssortingng getUsername() { return username; } public void setUsername(Ssortingng username) { this.username = username; } @Override public Ssortingng getPassword() { return password; } public void setPassword(Ssortingng password) { this.password = password; } public void setRoles(Set roles) { this.roles = roles; } public Set getRoles() { return roles; } } 

Et le Role.java est

 @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 Ssortingng username; @Column(name="ROLE") private Ssortingng role; public long getId() { return id; } public void setId(long id) { this.id = id; } public Ssortingng getUsername() { return username; } public void setUsername(Ssortingng username) { this.username = username; } public Ssortingng getRole() { return role; } public void setRole(Ssortingng role) { this.role = role; } } 

Ceci est ma première tentative d’annotation en hibernation avec JPA. Donc, toutes les suggestions seront très utiles.

Pour l’hibernation, les dépendances de pom.xml sont les suivantes:

   org.hibernate hibernate 3.5.4-Final pom comstack   org.hibernate hibernate-annotations 3.5.4-Final jar comstack   org.hibernate hibernate-core 3.5.4-Final jar comstack   org.hibernate hibernate-validator 3.1.0.GA jar comstack   org.hibernate hibernate-entitymanager 3.5.4-Final jar comstack  

Je n’ai aucune idée de la faute.

Merci.

J’ai eu le même problème avec la colonne @ManyToOne . C’était résolu … de manière stupide. J’avais toutes les autres annotations pour les méthodes de lecture en public, car elles étaient remplacées par la classe parente. Mais le dernier champ a été annoté pour une variable privée comme dans toutes les autres classes de mon projet. J’ai donc eu la même MappingException sans raison.

Solution: J’ai placé toutes les annotations sur les méthodes de getter publiques. Je suppose que Hibernate ne peut pas gérer les cas où les annotations pour les champs privés et les getters publics sont mélangées dans une classe.

L’ajout de @ElementCollection au champ List a résolu ce problème:

 @Column @ElementCollection(targetClass=Integer.class) private List counsortinges; 

Je suppose que vous utilisez un Set dans la classe User annotée avec @OneToMany . Ce qui signifie qu’un User a de nombreux Role . Mais sur le même champ, vous utilisez l’annotation @Column qui n’a aucun sens. Les relations un à plusieurs sont gérées à l’aide d’une table de jointure distincte ou d’une colonne de jointure sur les nombreux côtés, qui dans ce cas serait la classe de rôle. Utiliser @JoinColumn au lieu de @Column corrigerait probablement le problème, mais il semble sémantiquement faux. Je suppose que la relation entre le rôle et l’utilisateur doit être multiple.

Ne pas dire que votre mappage est correct ou faux, mais je pense que hibernate veut une instance de l’ensemble où vous déclarez le champ.

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

Solution:

 @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 Ssortingng username; @Column(name = "PASSWORD") private Ssortingng password; @Column(name = "NAME") private Ssortingng name; @Column(name = "EMAIL") private Ssortingng 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 roles; @Override public GrantedAuthority[] getAuthorities() { List list = new ArrayList(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 Ssortingng getUsername() { return username; } public void setUsername(Ssortingng username) { this.username = username; } @Override public Ssortingng getPassword() { return password; } public void setPassword(Ssortingng password) { this.password = password; } public Ssortingng getName() { return name; } public void setName(Ssortingng name) { this.name = name; } public Ssortingng getEmail() { return email; } public void setEmail(Ssortingng email) { this.email = email; } public boolean isLocked() { return locked; } public void setLocked(boolean locked) { this.locked = locked; } public Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } } 

Role.java même que ci-dessus.

Avait ce problème juste aujourd’hui et a découvert que j’ai laissé par inadvertance l’annotation @ManyToMany au-dessus de l’annotation @JoinTable.

J’ai eu le même problème, j’ai trouvé le problème que je mélangeais les annotations certains d’entre eux au-dessus des atsortingbuts et certains d’entre eux au-dessus des méthodes publiques. Je viens de mettre tous les atsortingbuts ci-dessus et cela fonctionne.

Il vous suffit d’append des annotations @Transient sur les rôles pour ne pas sérialiser l’ensemble.

Pourquoi Java a-t-il des champs transitoires?

J’ai eu un problème similaire où je recevais une erreur pour un membre de la classe qui n’était pas mappé à la colonne de firebase database, c’était juste un support pour une liste d’une autre entité. J’ai changé List to ArrayList et l’erreur a disparu. Je sais, je ne devrais vraiment pas le faire dans une entité cartographiée, et c’est ce que les DTO sont pour. Je voulais juste partager au cas où quelqu’un trouverait ce fil et les réponses ci-dessus ne s’appliquent pas ou ne aident pas.