主键类的关键部分代码如下:public class TUserPK implements Serializable
{
private  String firstname;
private  String lastname;//这两个字段是表中影射过来的双主键
         
         ……//构造函数中初始化这两个主键。        
         ……//两个字段的get,set方法
         /**
          *重写的equal方法
         **/
          public boolean equal(Object o)
{
   if(this==o)return true;
   if(!(o instanceof TUserPK))return false;

   final TUserPK pk=(TUserPK) o;

   if(!this.lastname.equals(pk.getLastname()))return false;
   if(!this.firstname.equals(pk.firstname))return false;

            return true;
}
         /**
          *重写的hashCode方法
         **/
public int hashCode()
{
    int result1;
    int result2;

    result1=(this.firstname==null?0:this.firstname.hashCode());
    result2=(this.lastname==null?0:this.lastname.hashCode());

    return result1+result2;
}
}测试类关键代码
public class Test
{
    ……
    TUserPK pk=new TUserPK("AAA","BBB");
    TUser2 user=new TUser2();//TUser2类是POJO类    user=(TUser2) session.load(TUser2.class, pk);
    System.out.println("User age is =>"+user.getAge());
    ……
}
用测试类运行时,抛如下异常
org.hibernate.PropertyAccessException: exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of hibernate.table.TUser2.TUser2.setAge
at org.hibernate.tuple.PojoTuplizer.setPropertyValuesWithOptimizer(PojoTuplizer.java:203)
at org.hibernate.tuple.PojoTuplizer.setPropertyValues(PojoTuplizer.java:173)
at org.hibernate.persister.entity.BasicEntityPersister.setPropertyValues(BasicEntityPersister.java:2919)
at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:113)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:530)
at org.hibernate.loader.Loader.doQuery(Loader.java:436)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:218)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1345)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:116)
at org.hibernate.loader.entity.EntityLoader.load(EntityLoader.java:101)
at org.hibernate.persister.entity.BasicEntityPersister.load(BasicEntityPersister.java:2471)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:351)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:332)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:113)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:75)
at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:643)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:59)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:84)
at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:134)
at hibernate.table.TUser2.TUser2$$EnhancerByCGLIB$$569cd2a.getAge(<generated>)
at hibernate.table.TUser2.TestClass.main(TestClass.java:24)
Caused by: net.sf.cglib.beans.BulkBeanException
at hibernate.table.TUser2.TUser2$$BulkBeanByCGLIB$$cff23d11.setPropertyValues(<generated>)
at org.hibernate.tuple.PojoTuplizer.setPropertyValuesWithOptimizer(PojoTuplizer.java:200)
... 20 more
Caused by: java.lang.ClassCastException
... 22 more
Exception in thread "main"

解决方案 »

  1.   

    setter of hibernate.table.TUser2.TUser2.setAge
    age是什么类型的
      

  2.   

    age---数据库(Oracle)中 NUMERIC
          影射后             Integer
      

  3.   

    TUserPK pk=new TUserPK("AAA",11);
      

  4.   

    两个主键(firstname,lastname)都是 
      数据库中  VARCHAR2
      影射后    String
      

  5.   

    TUser2 user=new TUser2();代码打出来看看
    还有你这个new的是无意义的(和你这的问题无关。只是不用new)
      

  6.   

    "TUser2 user=new TUser2();代码打出来看看"-----什么意思,我是初学,还请多指教
      

  7.   

    请帮我看看 我的equal,hashCode 方法写的有问题吗?是这两个方法重写错了吗?谢谢
      

  8.   

    嗷,明白了package hibernate.table.TUser2;
    import java.io.Serializable;
    public class TUser2
    {
    private Integer age;
    private TUserPK pk; public Integer getAge() {
    return age;
    }
    public void setAge(Integer age) {
    this.age = age;
    }
    public TUserPK getPk() {
    return pk;
    }
    public void setPk(TUserPK pk) {
    this.pk = pk;
    }
    }TUser2.hbm.xml 代码:
    <hibernate-mapping>
        <class name="hibernate.table.TUser2.TUser2" table="T_USER2" schema="LIUZHICHAO">
            <composite-id name="pk" class="hibernate.table.TUser2.TUserPK">
                <key-property name="firstname" type="string">
                    <column name="FIRSTNAME" length="50" />
                </key-property>
                <key-property name="lastname" type="string">
                    <column name="LASTNAME" length="50" />
                </key-property>
            </composite-id>
            <property name="age" type="long">
                <column name="AGE" precision="10" scale="0" not-null="true" />
            </property>
        </class>
    </hibernate-mapping>
      

  9.   

    我倒,我晕,我Over
    我在网吧,我回去试试,是不是这个错,
    如果是…………谢谢yhkyo,耐心的帮我
    谢谢了
      

  10.   

    我看到有人重写hashCode方法时,返回值是这样写的,return result1^result2;这么写有什么好处吗?
      

  11.   

    System.out.println("User age is =>"+user.getAge());
    ……
    这里user.getAge()到的是一个对象,应该把它转化为java内置类型,你看你的错误里不也提示了Caused by: java.lang.ClassCastException
    ... 22 more?
      

  12.   

    谢谢大家(尤其是yhkyo),找到错误了,就是在POJO类中将age的数据类型从Integer改为Long
    就是这个错误,昨天我回去调了调,出来了,谢谢yhkyo。