hibernate IllegalArgumentException in joined-subclass with Composite key
===

This is driving me nuts! I think this is a mapping problem, but I'm not sure. I'm new to Hibernate and I think using a joined-subclass with composite key is messing me up.

The error happens when I open a session and the message is:

    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


First mapping:

    <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>

And second 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>

The classes are:

    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;
	}

    }

I'm sure I'm going to kick myself when I figure this out, but could someone give me a hand?
Thanks
Dave