简单多对一的关系,使用HibernateSynchronizer生成的hbm加载正确但使用出错,延迟加载相关
还是上次那个 用户<->项目的关系,改成简单单向多对一
=======================User=======================
DDL:
CREATE TABLE `user` (
`USER_ID` int(11) NOT NULL,
`USER_NM` varchar(10) default NULL,
PRIMARY KEY (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
HBM:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.mypack">
<class
name="User"
table="user"
>
<meta attribute="sync-DAO">false</meta>
<id
name="id"
type="integer"
column="USER_ID"
>
<generator class="identity"/>
</id>
<property
name="userNm"
column="USER_NM"
type="string"
not-null="false"
length="10"
/>
<set name="prjs" inverse="true">
<key column="USER_ID"/>
<one-to-many class="Prj"/>
</set>
</class>
</hibernate-mapping>
============================ Prj ===========================
DDL:
CREATE TABLE `prj` (
`PRJ_ID` int(11) NOT NULL,
`USER_ID` int(11) default NULL,
`PRJ_NM` varchar(10) default NULL,
PRIMARY KEY (`PRJ_ID`),
KEY `FK_prj` (`USER_ID`),
CONSTRAINT `prj_ibfk_1` FOREIGN KEY (`USER_ID`) REFERENCES `user` (`USER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
HBM:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.mypack">
<class
name="Prj"
table="prj"
>
<meta attribute="sync-DAO">false</meta>
<id
name="id"
type="integer"
column="PRJ_ID"
>
<generator class="identity"/>
</id>
<property
name="prjNm"
column="PRJ_NM"
type="string"
not-null="false"
length="10"
/>
<many-to-one
name="user"
column="USER_ID"
class="User"
not-null="false"
>
</many-to-one>
</class>
</hibernate-mapping>
======================错误信息======================
Hibernate: select prj0_.PRJ_ID as PRJ1_22_0_, prj0_.PRJ_NM as PRJ2_22_0_, prj0_.USER_ID as USER3_22_0_ from prj prj0_ where prj0_.PRJ_ID=?
ERROR - StandardWrapperValve.invoke(253) | Servlet.service() for servlet action threw exception
java.lang.ExceptionInInitializerError
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
(……省略……)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Caused by: net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:237)
at net.sf.cglib.reflect.FastClass$Generator.create(FastClass.java:64)
at net.sf.cglib.proxy.MethodProxy.helper(MethodProxy.java:81)
at net.sf.cglib.proxy.MethodProxy.create(MethodProxy.java:46)
at com.aherp.voice.model.steno.User$$EnhancerByCGLIB$$c612f2b2.CGLIB$STATICHOOK4(<generated>)
at com.aherp.voice.model.steno.User$$EnhancerByCGLIB$$c612f2b2.<clinit>(<generated>)
... 71 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.GeneratedMethodAccessor44.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at net.sf.cglib.core.ReflectUtils.defineClass(ReflectUtils.java:384)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:219)
... 76 more
Caused by: java.lang.LinkageError: duplicate class definition: $java/lang/Object$$FastClassByCGLIB$$3f697993
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
... 81 more
=============================================================
PrjDAO prjDAO = (PrjDAO)getBean("prjDAO");
Prj prj = prjDAO.findById(1); //在此处出错
System.out.println("........step1......."); //<--此句未执行
System.out.println("............" + prj.getUser().getUserNm());
System.out.println("........step2......."); //<--此句未执行
return mapping.findForward("success");
启动没有错误,执行查询时错
最莫名其妙的错就是怎么最后的Cause By 是:duplicate class definition?
有SQL输出,证明第一个查询已经查询了,但是拿对象出现错误,应该与延迟加载有关。实际证明如果设置many-to-one的lazy=false就正常,但是我想使用延迟加载,有没有好的解决办法?