使用hibernate框架,写了客户和联系人一对多的关系,
将客户设置类延迟加载,使用load方法加载客户,报错如下:
org.hibernate.proxy.pojo.javassist.JavassistProxyFactory getProxy
ERROR: HHH000142: Javassist Enhancement failed: com.farsight.bean.Customer
java.lang.ClassCastException: com.farsight.bean.Customer_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy将客户端设置lazy=false,使用load方法加载客户,不报错。想问下为什么?
本人框架代码如下:
1)引入jar包如下
2)客户pojo,Customer.javaimport java.io.Serializable;
import java.util.HashSet;
import java.util.Set;public class Customer implements Serializable{
private Integer cust_id;
private String cust_name;
private Set<Linkman> linkmans = new HashSet<Linkman>(); public Customer() {
}
       //get ,set方法省略粘贴
}
配置文件Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.farsight.bean.Customer" table="customer" >
     <!-- 配置id -->
     <!-- name为javaBean属性
      column为表结构字段
      -->
      
     <id name="cust_id" column="cust_id">
     <!-- 主键的生成策略 -->
     <generator class="native">
     </generator>
     </id>
     <property name="cust_name" column="cust_name"></property>
      <set name="linkmans" inverse="true" cascade="save-update">
     <key column="lkm_cust_id"></key>
     <one-to-many class="com.farsight.bean.Linkman"></one-to-many>
     </set>
    </class>
</hibernate-mapping>
3)联系人pojo,Linkman.java
public class Linkman implements Serializable{
private Integer lkm_id;
private String lkm_name;
private Customer customer;
      //省略get、set方法
}配置文件Linkman.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.farsight.bean.Linkman" table="linkman">
<id name="lkm_id" column="lkm_id">
<!-- 主键的生成策略 -->
<generator class="native">
</generator>
</id>
<property name="lkm_name"></property>
<many-to-one name="customer" class="com.farsight.bean.Customer"
column="lkm_cust_id" cascade="save-update"  ></many-to-one>
</class>
</hibernate-mapping>4)hiberante.hbm.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">tiger</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.connection.isolation"></property>

<property name="hibernate.current_session_context_class">thread</property>

<mapping resource="com/farsight/bean/Customer.hbm.xml"/>
<mapping resource="com/farsight/bean/Linkman.hbm.xml"/>

</session-factory>
</hibernate-configuration>5)HibernateUtils。javaimport org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;public class HibernateUtils {
public static final Configuration config;
public static final SessionFactory factory;

static{
config = new Configuration().configure();
factory = config.buildSessionFactory();
}

public static Session getSession(){
return factory.openSession();
} public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}6)测试类
public class Test1 { @Test
public void testLazyToLoad(){
Session session=HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
//执行该句时没有SQL语句被执行
Customer customer = session.load(Customer.class, 1);
System.out.println("==============");
System.out.println(customer.getCust_name());
transaction.commit();
session.close();
}


}