with tutorial example ejemplo anotaciones java hibernate jpa annotations

tutorial - org.hibernate.MappingException: no se pudo determinar el tipo para: java.util.Set



jboss jpa hibernate example (9)

Agregar el @ElementCollection al campo Lista resolvió este problema:

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

Aunque esta pregunta se me hizo muchas veces y ya utilicé toda la sugerencia, sigo recibiendo este error.

El User.java es

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

Y el Role.java es

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

Este es mi primer intento en la anotación de hibernación con JPA. Entonces cualquier sugerencia será de mucha ayuda.

Para hibernar, las dependencias de pom.xml son:

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

No tengo ni idea de la falla.

Gracias.


No digo que tu asignación sea correcta o incorrecta, pero creo que hibernate quiere una instancia del conjunto donde declaras el campo.

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



Solución:

@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 igual que arriba.


Supongo que estás usando un Set<Role> en la clase User anotada con @OneToMany . Lo que significa que un User tiene muchos Role . Pero en el mismo campo usa la anotación @Column que no tiene sentido. Las relaciones uno a muchos se administran usando una tabla de combinación separada o una columna de unión en muchos lados, que en este caso sería la clase Función. Usar @JoinColumn lugar de @Column probablemente arreglaría el problema, pero parece ser semánticamente incorrecto. Supongo que la relación entre el rol y el usuario debe ser de muchos a muchos.


Tengo el mismo problema con la columna @ManyToOne . Fue resuelto ... de manera estúpida. Tenía todas las otras anotaciones para los métodos públicos getter, porque fueron anuladas de la clase principal. Pero el último campo fue anotado para variable privada como en todas las otras clases en mi proyecto. Así que obtuve la misma MappingException sin el motivo.

Solución: coloqué todas las anotaciones en los métodos getter públicos. Supongo que Hibernate no puede manejar casos, cuando las anotaciones para campos privados y public getters se mezclan en una clase.


Tuve este problema solo hoy y descubrí que, inadvertidamente, dejé la anotación @ManyToMany encima de la anotación @JoinTable.


Tuve un problema similar cuando obtenía un error para un miembro de la clase que no estaba asignado a la columna db, solo era titular de una lista de otra entidad. Cambié List a ArrayList y el error desapareció. Lo sé, realmente no debería hacer eso en una entidad mapeada, y eso es para lo que son las DTO. Solo quería compartir en caso de que alguien encuentre este hilo y las respuestas anteriores no se apliquen ni ayuden.


Tuve un problema similar. Encontré el problema de que estaba mezclando las anotaciones algunas de ellas por encima de los atributos y algunas de ellas por encima de los métodos públicos. Acabo de poner todos ellos por encima de los atributos y funciona.