2011-04-17 10 views
7

estoy frente a un problema extraño, lo he buscado en Google durante horas, pero no he encontrado la manera de resolverlo.IllegalArgumentException en la clase: ..., getter método de la propiedad: id

Aquí está la situación: tengo dos clases Roles y Privileges con la relación ManyToMany. Al agregar un privilegio a una función, al llamar al saveOrUpdate(role), entré en esta excepción.

aquí es la clase Rol

@Entity 
@Table(name = "ROLES") 
public class Role implements GenericDomain { 

private static final long serialVersionUID = -7620550658984151796L; 

private Long id; 
private String code; 
private String name; 

private Set<User> users = new HashSet<User>(0); 
private Set<Privilege> privileges = new HashSet<Privilege>(0); 

public Role() { 
} 

public Role(String code, String name) { 
    this.code = code; 
    this.name = name; 
} 


@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID") 
public Long getId() { return id; } 
public void setId(Long id) { this.id = id; } 

@Column(name = "CODE", unique = true, nullable = false, length = 16) 
@NotEmpty(message= "password.required") 
@Length(min = 3, max = 16) 
public String getCode() { return code; } 
public void setCode(String code) { this.code = code; } 

@Column(name="NAME", nullable = false, length = 64) 
@NotEmpty 
@Length(min = 1, max = 32) 
public String getName() { return name; } 
public void setName(String name) { this.name = name; } 

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "ROLES_PRIVILEGES" 
    , joinColumns = { @JoinColumn(name = "ROLE_ID") } 
    , inverseJoinColumns = { @JoinColumn(name = "PRIVILEGE_ID") } 
) 

public Set<Privilege> getPrivileges() { 
    return this.privileges; 
} 
public void setPrivileges(Set<Privilege> privileges) { 
    this.privileges = privileges; 
} 
    /* overide of hascode, equals*/ 
} 

Aquí es el privilegios de clase

@Entity 
@Table(name = "PRIVILEGES") 
public class Privilege implements GenericDomain { 

private static final long serialVersionUID = 4649689934972816194L; 

private Long id; 
private String code; 

private Set<Role> roles = new HashSet<Role>(0); 

public Privilege() { 
} 

public Privilege(String code) { 
    this.code = code; 
} 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
@Column(name = "ID") 
public Long getId() { return id; } 
public void setId(Long id) { this.id = id; } 

@Column(name = "CODE", unique = true, nullable = false, length = 16) 
@NotEmpty(message= "password.required") 
@Length(min = 3, max = 16) 
public String getCode() { return code; } 
public void setCode(String code) { this.code = code; } 

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges") 
public Set<Role> getRoles() { 
    return this.roles; 
} 
public void setRoles(Set<Role> roles) { 
    this.roles = roles; 
} 

/*overide equals and hascode*/ 

}

Y aquí es la excepción:

IllegalArgumentException in class: com.stunaz.domain.Privilege, getter method of property: id 
.... 
javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.stunaz.domain.Privilege.id 
.... 
java.lang.IllegalArgumentException: object is not an instance of declaring class 

Sus parece somethi ng está mal con mi mapeo, que en algún lugar debería pasar un objeto, pero estoy pasando un Id. pero no veo ese error.

gracias por cualquier consejo.

+0

Definí el código tal como lo hace en su ejemplo y funcionó bien para mí. Quizás puedas mostrar el método saveOrUpdate que mencionas en tu publicación. Quizás el problema está ahí. –

+0

sí, tiene razón no hay problema con hibernate –

+0

¿Ha resuelto este problema? Estoy teniendo el mismo error en mi proyecto. –

Respuesta

0

Para obtener una excepción de argumento ilegal invocando el método getId(), parece que Hibernate cree que el tipo de su ID es distinto de Largo (probablemente entero). Tal vez intente agregar @Type(type="long") a sus ID.

Cuando tengo problemas extraños con Hibernate, siempre adjunto el código fuente y reparo donde ocurre el error. Esto puede darle una idea de lo que Hibernate está tratando de hacer, y ayudarlo a descubrir dónde se ha perdido algo, o ha pasado un mal argumento en alguna parte.

+0

Gracias por su respuesta, pero no fue de ayuda. Por favor, dígame más sobre cómo depurar, ¿a qué fuente está adjuntando? y dónde y cómo te estás apegando? –

0

A primera vista, el código parece estar bien excepto quizás por:

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges") 

no estoy seguro si esto es incorrecto, pero esta es la forma en que lo hago:

@ManyToMany(cascade=CascadeType.REFRESH, mappedBy="privileges", targetEntity = Roles.class) 

Esta propiedad mappedBy incluso se puede omitir ...

+0

gracias, esto no ha ayudado ((( –

0

¿Cómo se guarda/actualiza esto?

¿Obtiene el objeto 'Role' para el que desea guardar el 'Permiso' llamando a findById (Long roleId)? Una vez que obtenga ese objeto de rol, cree un nuevo objeto de permiso y setRole (role) y configure otras propiedades y llame al saveOrUpdate (permission)? Eso debería funcionar.

1

Hibernate no es muy fácil de usar cuando se trata de decirle al usuario qué hay de malo en el mapeo.

Solución:

  1. Depurar la aplicación
  2. Establecer un punto de interrupción para el caso de IllegalArgumentException ser lanzado (en cualquier lugar)
  3. realizar la operación que hace que este
  4. Ir arriba a través de la pila de llamadas y inspeccionar las variables de la pila activa.

Utilizando este procedimiento, descubrí lo que estaba mal con mi asignación.

En general, por lo que he visto, es la clase por lo general mal declaró explícitamente en algún lugar, como @MapKeyClass(Wrong.class) cuando la llave es en realidad String etc.

O llamando mal API (Hibernate), al igual que setParameter() en lugar de setParameterList():

Query query = session.getNamedQuery(queryName); 
// org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter 
query.setParameter("children", aCollectionOfChildren); 
query.list(); 

O, en el caso de la API Criteria, he visto esto:

DetachedCrite ria crit = DetachedCriteria.forClass (Group.class); crit.add (Restrictions.eq ("principal", id));

El método de Grupo getParent() devuelve un Grupo pero yo estaba intentando para compararlo con un Largo.

0

Solo una nota para los demás, aunque esto podría no estar relacionado con este problema. Me sucedió que estaba mapeando un DTO proveniente de una API REST a una Entidad. Uno de los DTO secundarios no se asignó correctamente a una entidad secundaria (yo estaba usando Dozer). Hibernate falló porque la identificación del DTO no era compatible con la identificación de la Entidad.

Cuestiones relacionadas