使用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();
}
}
将客户设置类延迟加载,使用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();
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货