2011-04-17 7 views
7

столкнулся со странной проблемой, я уже много часов пробовал в Интернете, но не узнал, как ее решить.IllegalArgumentException в классе: ..., метод getter свойства: id

В следующей ситуации: у меня есть два класса Roles и Privileges с отношением ManyToMany. При добавлении Привилегии к роли, вызывающей saveOrUpdate(role), я пришел в это исключение.

здесь роль класса

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

Вот привилегиях класса

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

}

А вот исключение:

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 

Его, кажется что-то неправильно с моим сопоставлением, что где-то я должен передать объект, но я передаю Id.but, я не вижу эту ошибку.

благодарю вас за консультацию.

+0

Я определил код так же, как вы делаете в своем примере, и это сработало для меня. Возможно, вы можете показать метод saveOrUpdate, который вы укажете в своем сообщении. Возможно, проблема есть. –

+0

Да, вы правы, не проблема вообще с спящим –

+0

Решили ли вы эту проблему? У меня такая же ошибка в моем проекте. –

ответ

0

Чтобы получить недопустимое исключение аргумента, вызывающего метод getId(), кажется, что Hibernate считает, что тип вашего id - это нечто иное, чем Long (возможно, Integer). Возможно, попробуйте добавить @Type(type="long") к вашим идентификаторам.

Всякий раз, когда у меня возникают странные проблемы с Hibernate, я всегда прилагаю исходный код и отлаживаю, где происходит ошибка. Это может дать вам некоторое представление о том, что Hibernate пытается сделать, и помочь выяснить, где вы, возможно, что-то пропустили, или где-то провалился.

+0

Спасибо за ваш ответ, но это не помогло. Пожалуйста, расскажите мне больше о том, как вы отлаживаете, какой источник вы присоединяете? и где и как вы присоединяетесь? –

0

На первый взгляд код кажется нормально, за исключением, может быть, для:

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

Я не уверен, если это неправильно, но это так, как я это сделать:

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

Это свойство mappedBy может даже быть опущен ...

+0

спасибо, это не помогло ((( –

0

Как вы сохраняете/обновляете это?

Вы получаете объект «Роль», для которого вы хотите сохранить «Разрешение», вызывая findById (Long roleId)? Как только вы получите этот объект роли, создайте новый объект Permission и setRole (роль) и установите другие свойства и вызовите saveOrUpdate (разрешение)? Это должно сработать.

1

Hibernate не очень удобен, когда речь заходит о том, чтобы сообщить пользователю, что не так с картографированием.

Решение:

  1. Debug приложение
  2. Установить точку останова на случай IllegalArgumentException броска (в любом месте)
  3. Выполните операцию, которая вызывает этот
  4. Поднимитесь через стек вызовов и проверьте активные переменные стека.

Используя эту процедуру, я выяснил, что не так с моим картографированием.

В общем, от чего я видел, это, как правило, неправильно класс явно указано где-то, как @MapKeyClass(Wrong.class) когда ключ на самом деле String т.д.

Или, вызывая неправильное (Hibernate) API, как setParameter() вместо setParameterList():

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

Или, в случае Criteria API, я видел это:

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

Метод getParent() группы возвращает группу, но я пытался использовать , чтобы сравнить ее с Long.

0

Просто примечание для других, хотя это может быть не связано с этой проблемой. Случилось со мной, что я сопоставлял DTO, идущий от REST API к Entity. Один из дочерних DTO не был правильно привязан к дочернему Entity (я использовал Dozer). Hibernate не удалось, поскольку идентификатор DTO не был совместим с идентификатором Entity.

Смежные вопросы