一个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>
==================================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>
你Role 的 idRoles 不匹配。
public Integer getIdRoles() 这样试试
this.idRole= idRole;
} 还有这个 this.idRole 引用到哪去了?
改了,还是不行,debug半天说是classNotFoundException,也不知道是什么类找不到
@Id
@Column(name = "ID_ROLE", nullable = false)
public Integer getIdRole() {
return idRole;
}
public void setIdRole(Integer idRole) {
this.idRole= idRole;
} 把Role那段改成这样看看