一个hibernate映射到DB2数据库的程序
==================================ROLE (ID_ROLE, DESCRIPTION)
ROLE_PERSON (ID_ROLE, ID_PERSON)
PERSON (ID_PERSON, NAME)
  1. @Entity 
  2. public class Person implements Serializable { 
  3.   
  4. private int idPerson; 
  5.   
  6. @Id 
  7. @GeneratedValue(strategy=GenerationType.AUTO) 
  8. @Column(name = "ID_PERSON", nullable = false, insertable = true, updatable = true) 
  9. public int getIdPerson() { 
  10.        return idPerson; 
  11.    } 
  12.   
  13. public void setIdPerson(int idPerson) { 
  14.        this.idPerson = idPerson; 
  15.    } 
  16. ... 
  17. private Set <Role> roles = new HashSet <Role>(); 
  18.   
  19. @ManyToMany(cascade = CascadeType.ALL) 
  20. @JoinTable(name="ROLE_PERSON", 
  21. joinColumns= {@JoinColumn (name="ID_PERSON", referencedColumnName="ID_PERSON")}, 
  22. inverseJoinColumns= {@JoinColumn (name="ID_ROLE", referencedColumnName="ID_ROLE") } ) 
  23. public Set <Role> getRoles() { 
  24.        return roles; 
  25.    } 
  26.   
  27. public void setRoles(Set <Roles> roles) { 
  28.        this.roles= roles; 
  29.    } 
  30.   
  31. .. @Entity public class Person implements Serializable { private int idPerson; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = "ID_PERSON", nullable = false, insertable = true, updatable = true) public int getIdPerson() { return idPerson; } public void setIdPerson(int idPerson) { this.idPerson = idPerson; } ... private Set <Role> roles = new HashSet <Role>(); @ManyToMany(cascade = CascadeType.ALL) @JoinTable(name="ROLE_PERSON", joinColumns= {@JoinColumn (name="ID_PERSON", referencedColumnName="ID_PERSON")}, inverseJoinColumns= {@JoinColumn (name="ID_ROLE", referencedColumnName="ID_ROLE") } ) public Set <Role> getRoles() { return roles; } public void setRoles(Set <Roles> roles) { this.roles= roles; } ..view plaincopy to clipboardprint?  1. @Entity 
  2. public class Role { 
  3.   
  4. private Integer idRoles; 
  5.   
  6. @Id 
  7. @Column(name = "ID_ROLE", nullable = false) 
  8. public Integer getIdRole() { 
  9.        return idRole; 
  10.    } 
  11.   
  12. public void setIdRoles(Integer idRole) { 
  13.        this.idRole= idRole; 
  14.    } 
  15.   
  16. private Set <Person> persons= new HashSet <Person>(); 
  17.   
  18. @ManyToMany(cascade = CascadeType.ALL, mappedBy="roles") 
  19.  public Set <Person> getPerson() { 
  20.    return persons; 
  21.    } 
  22.   
  23. public void setPerson(Set <Person> persons) { 
  24.        this.persons= persons; 
  25.    } @Entity public class Role { private Integer idRoles; @Id @Column(name = "ID_ROLE", nullable = false) public Integer getIdRole() { return idRole; } public void setIdRoles(Integer idRole) { this.idRole= idRole; } private Set <Person> persons= new HashSet <Person>(); @ManyToMany(cascade = CascadeType.ALL, mappedBy="roles") public Set <Person> getPerson() { return persons; } public void setPerson(Set <Person> persons) { this.persons= persons; }The relationship works well by doing some HQLs (JPA-QLs). But when I want to persist a new Person-Instance, the following stacktrace occurs:  1. Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of entity.Role.idRole
  2. at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171) 
  3. at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183) 
  4. at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591) 
  5. at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307) 
  6. at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181) 
  7. at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218) 
  8. at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397) 
  9. at org.hibernate.type.EntityType.replace(EntityType.java:253) 
  10. at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:451) 
  11. at org.hibernate.type.CollectionType.replace(CollectionType.java:518) 
  12. at org.hibernate.type.TypeFactory.replace(TypeFactory.java:482) 
  13. at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:340) 
  14. at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:153) 
  15. at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126) 
  16. at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53) 
  17. at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677) 
  18. at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) 
  19. at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) 
  20. at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:227) 
  21. ... 140 more 
22. Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
  23. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
  24. at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
  25. at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
  26. at java.lang.reflect.Method.invoke(Unknown Source) 
  27. at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145) 
  28. ... 158 more 
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of entity.Role.idRole at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:183) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3591) at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3307) at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181) at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:218) at org.hibernate.type.EntityType.getIdentifier(EntityType.java:397) at org.hibernate.type.EntityType.replace(EntityType.java:253) at org.hibernate.type.CollectionType.replaceElements(CollectionType.java:451) at org.hibernate.type.CollectionType.replace(CollectionType.java:518) at org.hibernate.type.TypeFactory.replace(TypeFactory.java:482) at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:340) at org.hibernate.event.def.DefaultMergeEventListener.entityIsPersistent(DefaultMergeEventListener.java:153) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:126) at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:53) at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:677) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:661) at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:665) at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:227) ... 140 more Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145) ... 158 moreThis is my session-bean:view plaincopy to clipboardprint?  1. public void persistPerson(Person person) 
  2. { 
  3.   
  4. person.setName(this.person.getName()); 
  5. person.setRoles(this.person.getRoles()); 
  6. entityManager.persist(person); public void persistPerson(Person person) { person.setName(this.person.getName()); person.setRoles(this.person.getRoles()); entityManager.persist(person);This is my view to obtain the list of selected roles (this works):view plaincopy to clipboardprint?  1. <s:label value=Name"/> 
  2. <h:inputText value="#{bean.name}" required="true"/> 
  3.   
  4. <s:label value="Select Roles"/> 
  5. <h:selectManyCheckbox value="#{users.roles}"> 
  6. <s:selectItems value="#{bean.rolesList}" var="r" label="#{r.description}" itemValue="#{r.idRole}"/> 
  7. </h:selectManyCheckbox> <s:label value=Name"/> <h:inputText value="#{bean.name}" required="true"/> <s:label value="Select Roles"/> <h:selectManyCheckbox value="#{users.roles}"> <s:selectItems value="#{bean.rolesList}" var="r" label="#{r.description}" itemValue="#{r.idRole}"/> </h:selectManyCheckbox> 

解决方案 »

  1.   

    public Integer getIdRole()    
     你Role 的 idRoles 不匹配。
    public Integer getIdRoles()  这样试试
      

  2.   

    public void setIdRoles(Integer idRole) { 
          this.idRole= idRole; 
    } 还有这个 this.idRole 引用到哪去了?
      

  3.   


    改了,还是不行,debug半天说是classNotFoundException,也不知道是什么类找不到
      

  4.   

    private Integer idRolespublic Integer getIdRole()属性的GET访问器找不到你用注释命名的话,GET访问器要一样
      

  5.   

      private Integer idRole; 
     
      @Id 
      @Column(name = "ID_ROLE", nullable = false) 
      public Integer getIdRole() { 
            return idRole; 
      } 
      
      public void setIdRole(Integer idRole) { 
            this.idRole= idRole; 
      } 把Role那段改成这样看看