编辑#2 - 在底部添加了人员课程。
这让我疯了!我认为这是一个映射问题,但我不确定。我是Hibernate的新手,我认为使用带有复合键的连接子类会搞砸我。
当我打开会话并且消息是:
时发生错误Initial SessionFactory creation failed.org.hibernate.PropertyAccessException:
IllegalArgumentException occurred calling getter of com.dave.test.Person.personId
Exception in thread "main" java.lang.ExceptionInInitializerError
at com.mkyong.util.HibernateUtil.buildSessionFactory(HibernateUtil.java:17)
at com.mkyong.util.HibernateUtil.<clinit>(HibernateUtil.java:8)
at com.mkyong.App.main(App.java:21)
Caused by: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling
getter of com.dave.test.Person.personId
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get
(BasicPropertyAccessor.java:198)
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(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:172)
... 11 more
第一次映射:
<hibernate-mapping>
<class name="com.mkyong.stock.Appointment" table="appointment" catalog="physdb">
<composite-id name="id" class="com.dave.test.AppointmentId">
<key-property name="personId" type="int">
<column name="person_id" />
</key-property>
<key-property name="apptdate" type="timestamp">
<column name="apptdate" length="19" />
</key-property>
</composite-id>
<many-to-one name="client" update="false" insert="false" fetch="select">
<column name="person_id" not-null="true" />
</many-to-one>
<property name="location" type="string">
<column name="location" length="45" not-null="true" />
</property>
<property name="fee" type="big_decimal">
<column name="fee" precision="7" />
</property>
<property name="paid" type="big_decimal">
<column name="paid" precision="7" />
</property>
<property name="serviceRendered" type="boolean">
<column name="service_rendered" not-null="true" />
</property>
</class>
</hibernate-mapping>
第二次映射:
<hibernate-mapping>
<class name="com.dave.test.Person" table="person" catalog="physdb">
<id name="personId" >
<column name="person_id" />
<generator class="identity" />
</id>
<property name="firstName" type="string">
<column name="first_name" length="45" not-null="true" />
</property>
<property name="lastName" type="string">
<column name="last_name" length="45" not-null="true" />
</property>
<property name="phone" type="string">
<column name="phone" length="15" />
</property>
<property name="cellPhone" type="string">
<column name="`cell_phone`" length="15" />
</property>
<joined-subclass name="com.dave.test.Client" table="client" extends="Person">
<key column="person_id" />
<set name="appointments" cascade="all" inverse="true" lazy="false">
<key column="person_id"/>
<one-to-many class="com.dave.test.Appointment"/>
</set>
<property name="complaint" type="string">
<column name="complaint" not-null="true" />
</property>
<property name="notes" type="string">
<column name="notes" not-null="false" />
</property>
<property name="doctor" type="string">
<column name="doctor" not-null="false" />
</property>
</joined-subclass>
<joined-subclass name="com.dave.test.Therapist" table="therapist" extends="Person">
<key column="person_id" />
<property name="school" type="string">
<column name="school" not-null="false" />
</property>
<property name="specialties" type="string">
<column name="notes" not-null="false" />
</property>
<property name="hiredate" type="date">
<column name="hiredate" not-null="true" />
</property>
</joined-subclass>
</class>
</hibernate-mapping>
课程是:
public class Client extends Person implements java.io.Serializable {
private int personId;
private Person person;
private String complaint;
private String notes;
private String doctor;
private Set appointments = new HashSet();
public int getPersonId() {
return this.personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
}
public class Appointment implements java.io.Serializable {
private AppointmentId id;
private Client client;
private String location;
private BigDecimal fee;
private BigDecimal paid;
private boolean serviceRendered;
public AppointmentId getId() {
return this.id;
}
public void setId(AppointmentId id) {
this.id = id;
}
}
public class AppointmentId implements java.io.Serializable {
private int personId;
private Date apptdate;
public int getPersonId() {
return this.personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
}
public class Person implements java.io.Serializable {
private int personId;
private String firstName;
private String lastName;
private String phone;
private String cellPhone;
private Therapist therapist;
private Client client;
public int getPersonId() {
return this.personId;
}
public void setPersonId(int personId) {
this.personId = personId;
}
}
我确定当我想到这一点时我会踢自己,但是有人可以帮我一把吗? 谢谢 戴夫
答案 0 :(得分:0)
首先,Client
类包含personId
属性(加上getter和setter)。自Client
扩展Person
以来,它继承了personId
属性。因此,应删除Client
类中的那个。
第二件事,Client
类包含对Person
的引用,除非客户端有另一个Person
(has-a,not is-a),我认为是错误的并且可能导致问题(尽管未在XML中映射)。