IllegalArgumentException в классе: ..., метод получения свойства: id - PullRequest
7 голосов
/ 17 апреля 2011

столкнулся со странной проблемой, я гуглил ее часами, но не нашел, как ее решить.

Вот ситуация: у меня два класса 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.но я не вижу этой ошибки.

спасибо за любой совет.

Ответы [ 5 ]

1 голос
/ 29 января 2013

Hibernate не очень удобен для пользователя, когда говорит о том, что не так с отображением.

Решение:

  1. Отладка приложения
  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, я видел это:

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

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

0 голосов
/ 05 апреля 2016

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

0 голосов
/ 18 апреля 2011

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

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

Я не уверен, что это неверно, но я так и делаю:

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

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

0 голосов
/ 05 октября 2012

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

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

0 голосов
/ 18 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...