IllegalArgumentException in class: ..., getter method of property: id

storm_buster picture storm_buster · Apr 17, 2011 · Viewed 16k times · Source

am facing a weird problem, I have googled it for hours, but did not find out how to solve it.

Here is the the situation : i have two class Roles and Privileges with the relation ManyToMany. When adding a Privilege to a Role, the calling saveOrUpdate(role) , i came into this exception.

here is the Role Class

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

Here is the Privileges Class

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

}

And here is the the 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

Its seems something is wrong with my mapping, that somewhere i should pass an object but i am passing an Id.but i dont see that mistake.

thank for any advise.

Answer

Ondra Žižka picture Ondra Žižka · Jan 29, 2013

Hibernate is not much user friendly when it comes to telling user what's wrong with mapping.

Solution:

  1. Debug the app
  2. Set a breakpoint for the event of IllegalArgumentException being thrown (anywhere)
  3. Perform the operation which causes this
  4. Go up through the call stack and inspect the active stack variables.

Using this procedure, I figured out what was wrong with my mapping.

In general, from what I have seen, it's usually wrong class explicitely stated somewhere, like @MapKeyClass(Wrong.class) when the key is actually String etc.

Or, calling wrong (Hibernate) API, like setParameter() instead of setParameterList():

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

Or, in case of Criteria API, I have seen this:

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

The getParent() method of Group returns a Group but I was attempting to compare it against a Long.