小弟写了三张表  但运行异常  两张表的没有问题下面是代码  出现 第一张表  one-to-many class="com.dao.Ta2"/>的错误 异常信息在下面主表的 xml<hibernate-mapping>
    <class name="com.dao.Ta1" table="ta1" schema="dbo" catalog="txl">
        <id name="ids" type="java.lang.Integer">
            <column name="ids" />
            <generator class="native" />
        </id>
        <property name="names" type="java.lang.String">
            <column name="names" length="20" />
        </property>
        <set name="table" cascade="all" inverse="true">
        <key column="waijian"></key>
        <one-to-many class="com.dao.Ta2"/>
        </set>
    </class>
</hibernate-mapping>
第二张表的xml<hibernate-mapping>
    <class name="com.dao.Ta2" table="ta2" schema="dbo" catalog="txl">
        <id name="ids" type="java.lang.Integer">
            <column name="ids" />
            <generator class="native" />
        </id>
        <property name="tel" type="java.lang.String">
            <column name="tel" length="20" />
        </property>
        <many-to-one name="ta3" class="com.dao.Ta3" column="waijian" ></many-to-one>
    </class>
</hibernate-mapping>
第三张表的xml<hibernate-mapping>
    <class name="com.dao.Ta3" table="ta3" schema="dbo" catalog="txl">
        <id name="ids" type="java.lang.Integer">
            <column name="ids" />
            <generator class="native" />
        </id>
        <property name="zs" type="java.lang.String">
            <column name="zs" length="20" />
        </property>
        <many-to-one name="ta2" class="com.dao.Ta2" column="waijian" ></many-to-one>
    </class>
</hibernate-mapping>下面是DTO主表的 DTO    private Integer ids;
     private String waijian;
     private String names;
     private Set table = new HashSet();
第二张表的DTO private Integer ids;
     private String waijian;
     private String tel;
     private Ta3 ta3;
第三张表的DTO private Integer ids;
     private String waijian;
     private String zs;
     private Ta2 ta2;
集联添加出现以下异常Exception in thread "main" org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of com.dao.Ta2.ids
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
at org.hibernate.tuple.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:176)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3257)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:2983)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.getEntityState(AbstractSaveEventListener.java:460)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:84)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:502)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:494)
at org.hibernate.engine.CascadingAction$1.cascade(CascadingAction.java:134)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:213)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:157)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:290)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:185)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:160)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:108)
at org.hibernate.engine.Cascade.cascade(Cascade.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:410)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:299)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at com.dao.Ta1DAO.insert(Ta1DAO.java:39)
at text.main.main(main.java:32)
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(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
... 32 more

解决方案 »

  1.   

    1. 用select count(id) from table_a ; 返回的记录数必须Long类型,不然出错
    2. 在读取记录中的HQL,参数必须匹配,不然出错
    例如:
    表:table_a  ,table_b
    主键类型都是String id;table_a   多对1table_b根据table_b的Id来查询table_a里面的记录,hql如下
    from table_a  A  Where A.b = ? ;此时在传入?的参数必须是一个table_b类的实例,不能是一个String类型的id
    在hibernate 3.2之前的版本用String类型的id是不会出错的。