Buenas tardes.
Estoy modelando un @ManyToMany con JPA 2.0, usando la implementación de Hibernate Entity Manager que aporta JBoss 7.1.1.
La idea es bastante sencilla, pero no consigo saber que ocurre.
Tengo una tabla de usuarios, una tabla de puestos de trabajo, y una tabla de permisos.
Un usuario tiene asignado un puesto de trabajo, y un puesto de trabajo tiene varios perfiles. El problema es al editar un puesto de trabajo, me lanza la siguiente excepción:
java.lang.IllegalArgumentException: Can not set java.lang.Long field com.miproyecto.dto.Permiso.id to java.lang.String
El @ManyToMany lo tengo definido, tanto en la clase Puesto como en la clase Permiso de la siguiente forma:
Clase Puesto
public Class Puesto {
..............
/**
* Identificador del puesto.
*/
@Id
@Column(name = "ID_PUESTO")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
..............
/**
* Permisos asociados al puesto de trabajo.
*/
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name="PUESTOS_PERMISOS",
joinColumns=
@JoinColumn(name="ID_PUESTO", insertable = false, updatable = false),
inverseJoinColumns=
@JoinColumn(name="ID_PERMISO", insertable = false, updatable = false))
private List<Permiso> permisos;
Clase Permiso
public Class Permiso {
/**
* Identificador del
* permiso.
*/
@Id
@Column(name = "ID_PERMISO")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
.......
/**
* Puestos de trabajo asociados.
*/
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "permisos")
private List<Puesto> puestos;
La tabla que relaciona ambas entidades, se genera con el siguiente código SQL (con MariaDB como motor de base de datos.
CREATE TABLE IF NOT EXISTS `puestos_permisos` (
`ID_PUESTO` bigint(20) NOT NULL DEFAULT '0',
`ID_PERMISO` bigint(20) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID_PUESTO`,`ID_PERMISO`),
KEY `FK_PERMISO_PUESTO` (`ID_PERMISO`),
CONSTRAINT `FK_PERMISO_PUESTO` FOREIGN KEY (`ID_PERMISO`) REFERENCES `permisos` (`ID_PERMISO`),
CONSTRAINT `FK_PUESTO_PERMISO` FOREIGN KEY (`ID_PUESTO`) REFERENCES `puestos` (`ID_PUESTO`)
He estado buscando por documentación, foros y demás, y he encontrado que a mucha gente le ocurre el mismo error.
Lo que me han recomendado es pasar del @ManyToMany, y mapear la relación en una entidad nueva, PermisoPuestoDTO o algo así. Pero claro, tendría que mantener esa entidad, crearme sus DAOs... Me comentaban que con Hibernate no funcionaba bien este tipo de mapeos, pero no estoy seguro.
¿Os funcionan bien los ManyToMany?. ¿Sabéis que puede estar pasando?.
El proyecto tiene bastantes relaciones de este tipo, por lo que sería estupendo mapear todas las relaciones de esta forma.
Un saludo, y muchas gracias por vuestra ayuda.