0

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

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

4

1 回答 1

0

首先,Client类包含personId属性(加上 getter 和 setter)。由于Clientextends Person,它继承了该personId属性。所以Client应该删除类中的那个。

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

于 2012-07-21T08:34:11.343 回答