SSH整合时多表关联查询出现Javassist增强失败

时间:2022-01-31 12:42:08

Customer类对应的表为另一个表LinkMan的外键,在进行LinkMan表操作时,出现如下错误。

SSH整合时多表关联查询出现Javassist增强失败

遇到Javassist增强失败网上说法不一,有的说Customer没有无参构造方法,javassist-3.18.1-GA.jar问题,还有的说Tomcat版本问题,但都没有解决。

最终解决的方法是:设置lazy=“false”,还有在web.xml中配置Session的延迟关闭的过滤器(其要在Struts2的过滤器的前面),步骤如下

1、在Customer.hbm.xml中添加如下lazy="false"

SSH整合时多表关联查询出现Javassist增强失败

2、在web.xml中添加如下

SSH整合时多表关联查询出现Javassist增强失败

总结

一、

Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势。 但是,延迟加载也是项目开发中特别常见的一个错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。所以,在开发独立的DAO数据访问层时应该格外小心这个问题。

二、

当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的也是代理对象,所以在上面这几种场景下就是延迟加载。

   Hibernate中<class lazy=””>默认为true。如果,在load的时候只会返回一个代理类,并不会正在从数据库中读取数据。第一次用到时,会将所有普通属性(set这种就不是)全部加载进来。如果第一次使用到时,session已经关闭将发生错误。

  如果显式是设置lazy=false,load的时候即会把所有普通属性全部读取进来。而且,返回的将是一个真正的该类型的对象(如Person),而不是代理类。

三、

Hibernate中允许使用延迟加载的地方主要有以下几个地方:

<hibernate-mapping default-lazy=(true|false)”true”>:设置全局的延迟加载策略。

<class lazy=(true|false)>:DTD没设置默认值,推理默认值为true

<property lazy=(true|false)>:设置字段延迟加载,默认为false

<component lazy=(true|false):默认为false

<subclass lazy=(true|false)>:默认设置为true

<join-subclass lazy=(true|false)>:默认设置为true

<union-subclass lazy=(true|false)>:默认设置为true

<many-to-one lazy=(proxy|no-proxy|false)>:默认为proxy

<one-to-one lazy=(proxy|no-proxy|false)>:默认为proxy

<map lazy=(true|extra|false)>:默认为true

<set lazy=(true|extra|false)>:默认为true

<bag lazy=(true|extra|false)>:默认为true

<ibag lazy=(true|extra|false)>:默认为true

<list lazy=(true|extra|false)>:默认为true

参考文献

http://www.cnblogs.com/heyongjun1997/p/5775033.html

http://m.educity.cn/wenda/453612.html