2011-04-17 1 views
7

suis face à un problème étrange, je l'ai googlé pendant des heures, mais je n'ai pas trouvé comment le résoudre.IllegalArgumentException dans la classe: ..., getter méthode de propriété: id

Voici la situation: j'ai deux classes Roles et Privileges avec la relation ManyToMany. Lors de l'ajout d'un privilège à un rôle, l'appelant saveOrUpdate(role), je suis entré dans cette exception.

ici est la classe de rôle

@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*/ 
} 

Voici les privilèges de classe

@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*/ 

}

Et voici la exception:

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 

Son semble somethi ng est faux avec ma cartographie, que quelque part je devrais passer un objet mais je passe un Id. mais je ne vois pas cette erreur.

merci pour tout conseil.

+0

J'ai défini le code comme vous le faites dans votre exemple et cela a bien fonctionné pour moi. Peut-être que vous pouvez montrer la méthode saveOrUpdate que vous mentionnez dans votre message. Peut-être que le problème est là. –

+0

Oui, vous avez raison ne pas du tout problème avec Hibernate –

+0

Avez-vous résolu ce problème? J'ai la même erreur dans mon projet. –

Répondre

0

Pour obtenir une exception d'argument illégal appelant la méthode getId(), il semble qu'Hibernate pense que le type de votre identifiant est différent de Long (probablement Integer). Peut-être essayer d'ajouter @Type(type="long") à vos identifiants.

Chaque fois que j'ai des problèmes étranges avec Hibernate, j'attache toujours le code source et débogue autour où l'erreur se produit. Cela peut vous donner un aperçu de ce que Hibernate essaie de faire, et aider à comprendre où vous avez manqué quelque chose, ou passé un mauvais argument quelque part.

+0

Merci pour votre réponse, mais il n'a pas aidé. S'il vous plaît dites-moi plus sur la façon dont vous déboguez, quelle source attachez-vous? et où et comment vous attacherez-vous? –

0

À première vue, votre code semble bien, sauf peut-être pour:

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

Je ne suis pas sûr si cela est incorrect, mais cela est la façon dont je le fais:

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

Cette propriété mappedBy pourrait même être omis ...

+0

merci, cela n'a pas aidé ((( –

0

Comment sauvegardez-vous/mettez-vous à jour ceci?

Obtenez-vous l'objet 'Rôle' pour lequel vous voulez enregistrer le 'Permission' en appelant findById (Long roleId)? Une fois que vous obtenez cet objet de rôle, créez un nouvel objet Permission et définissez Rôle (rôle) et définissez d'autres propriétés et appelez saveOrUpdate (permission)? Cela devrait fonctionner.

1

Hibernate n'est pas très convivial quand il s'agit de dire à l'utilisateur ce qui ne va pas avec la cartographie.

Solution:

  1. Debug l'application
  2. Définir un point d'arrêt pour l'événement de IllegalArgumentException être jeté (partout)
  3. Effectuer l'opération qui provoque cette
  4. Go à travers la pile d'appel et inspecter les variables de pile actives.

En utilisant cette procédure, j'ai trouvé ce qui n'allait pas avec ma cartographie.

En général, de ce que je l'ai vu, il est classe généralement mal explicitement dit quelque part, comme @MapKeyClass(Wrong.class) lorsque la clé est en fait String etc.

Ou, appeler mauvais (Hibernate) API, comme setParameter() au lieu de setParameterList():

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

Ou, dans le cas de l'API de critères, je l'ai vu:

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

La méthode getParent() de Group renvoie un groupe mais j'essayais de le comparer à un long. Juste une note pour les autres, bien que cela puisse ne pas être lié à ce problème.

0

Il m'est arrivé de mapper un DTO provenant d'une API REST vers une entité. L'un des DTO enfant n'était pas mappé correctement à une entité enfant (j'utilisais Dozer). Hibernate a échoué car l'ID du DTO n'était pas compatible avec l'ID de l'entité.

Questions connexes