Foros del Web » Programación para mayores de 30 ;) » Java »

[JPA 2.0] @ManyToMany

Estas en el tema de [JPA 2.0] @ManyToMany en el foro de Java en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 26/02/2013, 06:38
 
Fecha de Ingreso: marzo-2006
Mensajes: 106
Antigüedad: 18 años, 2 meses
Puntos: 0
[JPA 2.0] @ManyToMany

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.
__________________
"El río más profundo siempre es el más silencioso"
  #2 (permalink)  
Antiguo 26/02/2013, 23:54
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 12 años, 8 meses
Puntos: 29
Respuesta: [JPA 2.0] @ManyToMany

Puedes pegar el código de cómo estás editando un puesto de trabajo?

He trabajado (y trabajo) con @ManyToMany en JPA y ningún problema.
__________________
www.sttorybox.com , el lugar de las historias :)
  #3 (permalink)  
Antiguo 27/02/2013, 06:15
 
Fecha de Ingreso: marzo-2006
Mensajes: 106
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: [JPA 2.0] @ManyToMany

Buenas.

He seguido la traza y parece que no es de propio @ManyToMany el problema.

Uso JSF 2.1 para la vista. El @ManyToMany lo calculo a partir de un <h:selectManyCheckbox />, que calculo de la siguiente forma:

Código:
	<h:selectManyCheckbox
                id="permisos"
                value="#{puestosBean.permisosEntidad}"
		layout="pageDirection">
			<f:selectItems value="#{puestosBean.permisos}" />
	</h:selectManyCheckbox>
En el lado del Backing bean tengo lo siguiente:
Código:

	/**
	 * Lista de permisos
	 * posibles.
	 */
	private List<SelectItem> permisos;

	/**
	 * Permisos de la entidad.
	 */
	private Set<Permiso> permisosEntidad;

	/**
	 * Devuelve la lista de posibles
	 * permisios.
	 * @return Lista de posibles
	 * 		permisos
	 */
	public List<SelectItem> getPermisos() {
		return permisos;
	}

	/**
	 * Inserta la lista
	 * de posibles permisos.
	 * @param permisos Lista de
	 * 		posibles permisos
	 */
	public void setPermisos(
			final List<SelectItem> permisos) {
		this.permisos = permisos;
	}

	/**
	 * Devuelve la lista de
	 * permisos de la entidad.
	 * @return Lista de permisos
	 * 		de la entidad
	 */
	public Set<Permiso> getPermisosEntidad() {
		return permisosEntidad;
	}

	/**
	 * Inserta la lista de
	 * permisos de la entidad.
	 * @param permisosEntidad Lista de permisos
	 * 		de la entidad
	 */
	public void setPermisosEntidad(
			final Set<Permiso> permisosEntidad) {
		this.permisosEntidad = permisosEntidad;
	}

	/**
	 * Carga los combos para los
	 * crud.
	 */
	@PostConstruct
	public void cargarCombos() {
		final List<Permiso> todosPermisos = this.permisosBO.getTodos();
		this.permisos = new ArrayList<SelectItem>();

		if ((todosPermisos != null) && !todosPermisos.isEmpty()) {
			for (final Permiso permiso : todosPermisos) {
				final SelectItem elem = new SelectItem();

				elem.setDescription(permiso.getDescripcion());
				elem.setLabel(permiso.getNombre());
				elem.setValue(permiso);

				this.permisos.add(elem);
			}
		}

		if (this.getEntidad() != null) {
			this.permisosEntidad = this.getEntidad().getPermisos();
		}
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String guardado() {
		final Puesto entidad = this.getEntidad();
		entidad.setPermisos(this.permisosEntidad);
		if (this.getEntidad().getId() == null) {
			this.puestosBO.guardar(entidad);
		} else {
			this.puestosBO.editar(entidad);
		}

		return Nav.PUESTOS;
	}
Al parecer, aunque el atributo "permisosEntidad" es un Set<Permiso>, la etiqueta <h:selectManyCheckbox /> ¡me mete una lista de Strings!.

Y al pasárselo a la entidad, e intentar guardarlo con JPA, me sale ese error de casting. Por eso me dice que no puede convertirlo a String...

No se si tengo que implementarme un conversor para este tipo de etiquetas.

¡Muchas gracias por el interés jav_000!.

Un saludo.
__________________
"El río más profundo siempre es el más silencioso"

Etiquetas: clase, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:17.