2012-07-19 57 views
0

编辑#2 - 在底部添加人员类。hibernate连接子类中的IllegalArgumentException带复合键

这让我疯狂!我认为这是一个映射问题,但我不确定。我是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; 
} 
} 

我敢肯定,当我知道这件事时我会踢自己,但有人能帮我一把吗? 谢谢 Dave

+0

请提供'Person'类的内容。 – 2012-07-20 06:51:45

+0

好主意!我编辑了帖子,并在底部添加了人物类。 – Dave 2012-07-20 14:00:14

+0

看起来你忽略了Person类声明和私有属性(那些是我之前的)。 – 2012-07-20 14:14:48

回答

0

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

第二件事,Client类包含一个参照Person,其中,除非客户有另一个Person(有-A,而不是IS-A),我认为是错误的,可能导致问题(虽然没有被映射XML)。

+1

好点,我改变了客户端,并取消了personId getter和setter以及Person引用,但仍然得到相同的错误:2012-07-21_10:59:19.121错误ohproperty.BasicPropertyAccessor - 类com.dave中的IllegalArgumentException。 test.Person,getter方法属性:personId Initial SessionFactory创建failed.org.hibernate.PropertyAccessException:发生IllegalArgumentException调用get.dat.test.Person.personId的getter 线程“main”中的异常java.lang.ExceptionInInitializerError – Dave 2012-07-21 15:02:06

+0

My上面的评论格式不好,所以简短的回复是修复失败。 – Dave 2012-07-21 17:10:45

+0

@Dave我无法使用您提供的代码重现问题 - 它毫无例外地工作。您需要提供一组重现问题的源代码(尝试在单独的项目中)。 – 2012-07-21 20:21:28