hibernate hbm异常An association from the table refers to an unmapped class LoginUser.hbm.xmlUser.hbm.xml解析的时候,先解析LoginUser再解析User。而此时User尚未解析,SchemaExport找不到User类,必然报错。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果你使用SchemaExport时用了--config=/hibernate.cfg.xml,那么你在该文件中把被引用的类的配置文件放前面就可以了。比如<mapping resource="User.hbm.xml"/><mapping resource="LoginUser.hbm.xml"/> 我就是先解User.hbm.xml的,而且也正常通过了.但是到了LoginUser就不行了 你这里用的外键关联方式,User.hbm.xml是不是也需要指定一下,我没试过呀,不过你可以试一下呀:) 不知道你如何使用SchemaExport。java? SchemaExportTask? 自行编写代码?我在使用hibernate的ext-tools中的hbm2javaTask的时候,他就没有保存已经解析过的类,后来我把他源代码改了。不过我在用java SchemaExport就没问题。如果你是自己写java代码运行SchemaExport的话,你要注意classMappings变量,解析完一个类,要将此类保存到该变量中,可以自行研究一下SchemaExportTask.java。 用的是<target name="SchemaExport"><java classname="net.sf.hibernate.tool.hbm2ddl.SchemaExport" failonerror="true" ><classpath refid="SchemaExport.classpath" /><arg value="--${HIBERNATE_HOME}/bin/hibernate.properties" /><arg value="${src}/LoginUser.hbm.xml" /></java></target>我也把User.class加了classpath中了呀 <!--hbm 2 ddl--> <target name="h"> <java dir="classes" classname="net.sf.hibernate.tool.hbm2ddl.SchemaExport" fork="true" classpathref="p"> <classpath><pathelement location="./classes"/></classpath> <arg value="--config=/hibernate.cfg.xml"/> <arg value="--output=../resource/db/form.sql"/> <!--arg value="-quiet"/> <arg value="--text"/> <arg value="--format"/> <arg value="--delimiter=;"/> </java> </target> 重要目录结构如下:WEB-INF<dir>|--build.xml|--classes<dir> |--hibernate.cfg.xml1.使用dir="classes"和fork="true"让该命令以classes目录为根目录运行。2.每个类使用自己的配置文件,放在各自的目录下。比如<mapping resource="po/test/TestSimple.hbm.xml"/>3.在hibernate.cfg.xml中注册这些文件。因此只要用--config=/hibernate.cfg.xml,不需要指定mapping_files参数,如你写的<arg value="${src}/LoginUser.hbm.xml" /> 描述得不好,修改一下:2.每个类使用自己的配置文件,放在各自的目录下。比如classes/po/test/TestSimple.hbm.xml3.在hibernate.cfg.xml中注册这些文件。<mapping resource="po/test/TestSimple.hbm.xml"/>4.然后只需要--config=/hibernate.cfg.xml参数就可以了,因为要解析的xml文件,都已经注册在hibernate.cfg.xml里面。其他你的bin目录等同于我的classes目录,是.class的存放目录。hibernate.properties应该也可以注册每个类的配置文件。 感谢楼上的帮助,但是您给我介绍了一套好的方法,并没有告诉我错误的原因,以及为什么这么解决我的classpath<property name="build" value="/eclipse/workspace/myself/Web root/WEB-INF/classes"/><property name="src" value="/eclipse/workspace/myself/Java source" /><property name="HIBERNATE_HOME" value="/tmp/tus/hibernate-2.1" /><property name="HIBERNATE.LIB" value="${HIBERNATE_HOME}/lib" /><property name="JDBC_DRIVER" value="${HIBERNATE.LIB}/mysql-connector-java-3.0.14-production-bin.jar" /><property name="PROPS" value="${HIBERNATE_HOME}/src" /><property name="project.dir" value="\eclipse\workspace\myself" /> <path id="SchemaExport.classpath"> <pathelement path="${PROPS}" /> <pathelement path="${HIBERNATE_HOME}/hibernate2.jar" /> <pathelement path="${JDBC_DRIVER}" /> <pathelement path="${HIBERNATE.LIB}/commons-logging-1.0.4.jar" /> <pathelement path="${HIBERNATE.LIB}/commons-collections-2.1.1.jar" /> <pathelement path="${HIBERNATE.LIB}/commons-lang-1.0.1.jar" /> <pathelement path="${HIBERNATE.LIB}/cglib-2.0-rc2.jar" /> <pathelement path="${HIBERNATE.LIB}/dom4j-1.4.jar" /> <pathelement path="${HIBERNATE.LIB}/odmg-3.0.jar" /> <pathelement path="${HIBERNATE.LIB}/xml-apis.jar" /> <pathelement path="${HIBERNATE.LIB}/xerces-2.4.0.jar" /> <pathelement path="${HIBERNATE.LIB}/xalan-2.4.0.jar" /> <pathelement path="${build}" /> </path> 错误原因前面说过:指定要解析的类文件的顺序。你看错误提示;net.sf.hibernate.MappingException: An association from the table loginuser refers to an unmapped class: com.my.test.User意思很明显,LoginUser关联User类。那么,User类必须在LoginUser之前解析。因此,在hibernate.cfg.xml中注册时,顺序如下:<mapping resource="User.hbm.xml"/><mapping resource="LoginUser.hbm.xml"/>另外,像你这样导入jar会累死,建议用如下方法:---------- <path id="p"> <pathelement location="${classpath}"/> <fileset dir="lib/"> <include name="**/*.jar"/> </fileset> </path>----------这样lib目录下的所有jar文件都导入了。你只要把工程所有需要用到的jar文件,都放入lib目录就可以。 <pathelement location="${classpath}"/>这个是系统的classpath环境变量,我的电脑中,只设定为.; 我的是在之解晰的<hibernate-configuration> <session-factory> <property name="connection.datasource">java:comp/env/jdbc/temp</property> <property name="show_sql">false</property> <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> <!-- Mapping files --> <mapping resource="User.hbm.xml"/> <mapping resource="LoginUser.hbm.xml"/> </session-factory></hibernate-configuration> 考,疯掉了,我讨厌hibernate [java] net.sf.hibernate.HibernateException: hibernate.cfg.xml not found ssh整合 配置报错 请各位ggjj帮忙看看~!在线等待 ejb从jboss 到 WebLogic 转换的样式表 JAVA 菜鸟问题 DOS里执行带参数的命令 函数获取参数 JSON 反序列化为 JavaBean对象 webwork验证问题 高人们啊,快来帮小弟一把,不胜感激,关于Tomcat 5.5.17+jdk1.5.0的设置问题 sping高手请做答,先谢谢了! 再次遇到问题,望大虾指教。有关XML解析的。等呀等呀 tomcat问题 ssh中jsp页面的dataGrid无法获得数据 一个hibernate问题,请大家帮帮忙! JTable的问题
<mapping resource="LoginUser.hbm.xml"/>
:)
<target name="SchemaExport">
<java classname="net.sf.hibernate.tool.hbm2ddl.SchemaExport" failonerror="true" >
<classpath refid="SchemaExport.classpath" />
<arg value="--${HIBERNATE_HOME}/bin/hibernate.properties" />
<arg value="${src}/LoginUser.hbm.xml" />
</java>
</target>我也把User.class加了classpath中了呀
<target name="h">
<java dir="classes" classname="net.sf.hibernate.tool.hbm2ddl.SchemaExport" fork="true" classpathref="p">
<classpath><pathelement location="./classes"/></classpath>
<arg value="--config=/hibernate.cfg.xml"/>
<arg value="--output=../resource/db/form.sql"/>
<!--arg value="-quiet"/>
<arg value="--text"/>
<arg value="--format"/>
<arg value="--delimiter=;"/>
</java>
</target>
|--build.xml
|--classes<dir>
|--hibernate.cfg.xml1.使用dir="classes"和fork="true"让该命令以classes目录为根目录运行。2.每个类使用自己的配置文件,放在各自的目录下。比如
<mapping resource="po/test/TestSimple.hbm.xml"/>3.在hibernate.cfg.xml中注册这些文件。因此只要用--config=/hibernate.cfg.xml,不需要指定mapping_files参数,如你写的<arg value="${src}/LoginUser.hbm.xml" />
<mapping resource="po/test/TestSimple.hbm.xml"/>4.然后只需要--config=/hibernate.cfg.xml参数就可以了,因为要解析的xml文件,都已经注册在hibernate.cfg.xml里面。其他
你的bin目录等同于我的classes目录,是.class的存放目录。
hibernate.properties应该也可以注册每个类的配置文件。
<property name="build" value="/eclipse/workspace/myself/Web root/WEB-INF/classes"/>
<property name="src" value="/eclipse/workspace/myself/Java source" />
<property name="HIBERNATE_HOME" value="/tmp/tus/hibernate-2.1" />
<property name="HIBERNATE.LIB" value="${HIBERNATE_HOME}/lib" />
<property name="JDBC_DRIVER" value="${HIBERNATE.LIB}/mysql-connector-java-3.0.14-production-bin.jar" />
<property name="PROPS" value="${HIBERNATE_HOME}/src" />
<property name="project.dir" value="\eclipse\workspace\myself" /> <path id="SchemaExport.classpath">
<pathelement path="${PROPS}" />
<pathelement path="${HIBERNATE_HOME}/hibernate2.jar" />
<pathelement path="${JDBC_DRIVER}" />
<pathelement path="${HIBERNATE.LIB}/commons-logging-1.0.4.jar" />
<pathelement path="${HIBERNATE.LIB}/commons-collections-2.1.1.jar" />
<pathelement path="${HIBERNATE.LIB}/commons-lang-1.0.1.jar" />
<pathelement path="${HIBERNATE.LIB}/cglib-2.0-rc2.jar" />
<pathelement path="${HIBERNATE.LIB}/dom4j-1.4.jar" />
<pathelement path="${HIBERNATE.LIB}/odmg-3.0.jar" />
<pathelement path="${HIBERNATE.LIB}/xml-apis.jar" />
<pathelement path="${HIBERNATE.LIB}/xerces-2.4.0.jar" />
<pathelement path="${HIBERNATE.LIB}/xalan-2.4.0.jar" />
<pathelement path="${build}" />
</path>
net.sf.hibernate.MappingException: An association from the table loginuser refers to an unmapped class: com.my.test.User意思很明显,LoginUser关联User类。那么,User类必须在LoginUser之前解析。因此,在hibernate.cfg.xml中注册时,顺序如下:
<mapping resource="User.hbm.xml"/>
<mapping resource="LoginUser.hbm.xml"/>
另外,像你这样导入jar会累死,建议用如下方法:
----------
<path id="p">
<pathelement location="${classpath}"/>
<fileset dir="lib/">
<include name="**/*.jar"/>
</fileset>
</path>
----------
这样lib目录下的所有jar文件都导入了。你只要把工程所有需要用到的jar文件,都放入lib目录就可以。
<hibernate-configuration> <session-factory> <property name="connection.datasource">java:comp/env/jdbc/temp</property>
<property name="show_sql">false</property>
<property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> <!-- Mapping files -->
<mapping resource="User.hbm.xml"/>
<mapping resource="LoginUser.hbm.xml"/>
</session-factory></hibernate-configuration>