带有Composite键的join-subclass中的hibernate IllegalArgumentException

时间:2012-07-19 20:45:03

标签: hibernate database-design orm hibernate-mapping

编辑#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;
}
}

我确定当我想到这一点时我会踢自己,但是有人可以帮我一把吗? 谢谢 戴夫

1 个答案:

答案 0 :(得分:0)

首先,Client类包含personId属性(加上getter和setter)。自Client扩展Person以来,它继承了personId属性。因此,应删除Client类中的那个。

第二件事,Client类包含对Person的引用,除非客户端有另一个Person(has-a,not is-a),我认为是错误的并且可能导致问题(尽管未在XML中映射)。