hibernate hbm异常An association from the table refers to an unmapped class

vcshcn 2004-11-25 09:11:18
public class LoginUser implements java.io.Serializable {
private String id;
private User user;
private String loginname;
private String passwd;
}
public class User implements java.io.Serializable {
private String userid;
private String name;
private int age;
}
为了省地,我没有写那些set,get方法
LoginUser.hbm.xml
<hibernate-mapping>
<class name="com.my.test.LoginUser" table="loginuser">
<id name="id" type="string" >
<column name="id" sql-type="char(32)" not-null="true"/>
<generator class="foreign">
<param name="property">user</param>
</generator>
</id>
<property name="loginname" />
<property name="passwd" />

<one-to-one name="user" class="com.my.test.User" constrained="true"/>
</class>
</hibernate-mapping>

User.hbm.xml
<class name="com.my.test.User" table="user2">
<id name="id" type="string" >
<column name="id" sql-type="char(32)" not-null="true"/>
<generator class="native"/>
</id>
<property name="name" />
<property name="age" />
</class>

当我SchemaExport LoginUser.hbm.xml时,总是异常
[java] net.sf.hibernate.MappingException: An association from the table loginuser refers to an unmapped class: com.my.test.User
[java] at net.sf.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:682)
[java] at net.sf.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:666)
[java] at net.sf.hibernate.cfg.Configuration.generateDropSchemaScript(Configuration.java:459)
[java] at net.sf.hibernate.tool.hbm2ddl.SchemaExport.<init>(SchemaExport.java:58)

这是为什么? 什么情况总是出这种异常呢?
...全文
3305 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcshcn 2004-11-29
  • 打赏
  • 举报
回复
考,疯掉了,我讨厌hibernate

[java] net.sf.hibernate.HibernateException: hibernate.cfg.xml not found
vcshcn 2004-11-29
  • 打赏
  • 举报
回复
我的是在之解晰的
<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>
禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
<pathelement location="${classpath}"/>

这个是系统的classpath环境变量,我的电脑中,只设定为.;
禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
错误原因前面说过:指定要解析的类文件的顺序。

你看错误提示;
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目录就可以。
禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
不知道你如何使用SchemaExport。java? SchemaExportTask? 自行编写代码?

我在使用hibernate的ext-tools中的hbm2javaTask的时候,他就没有保存已经解析过的类,后来我把他源代码改了。不过我在用java SchemaExport就没问题。

如果你是自己写java代码运行SchemaExport的话,

你要注意classMappings变量,解析完一个类,要将此类保存到该变量中,可以自行研究一下SchemaExportTask.java。
vcshcn 2004-11-28
  • 打赏
  • 举报
回复
感谢楼上的帮助,但是您给我介绍了一套好的方法,并没有告诉我错误的原因,以及为什么这么解决

我的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>

禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
描述得不好,修改一下:

2.每个类使用自己的配置文件,放在各自的目录下。比如classes/po/test/TestSimple.hbm.xml

3.在hibernate.cfg.xml中注册这些文件。
<mapping resource="po/test/TestSimple.hbm.xml"/>

4.然后只需要--config=/hibernate.cfg.xml参数就可以了,因为要解析的xml文件,都已经注册在hibernate.cfg.xml里面。

其他
你的bin目录等同于我的classes目录,是.class的存放目录。
hibernate.properties应该也可以注册每个类的配置文件。
禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
重要目录结构如下:

WEB-INF<dir>
|--build.xml
|--classes<dir>
|--hibernate.cfg.xml

1.使用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" />
禽兽v5 2004-11-28
  • 打赏
  • 举报
回复
<!--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>
vcshcn 2004-11-28
  • 打赏
  • 举报
回复
用的是
<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中了呀
vcshcn 2004-11-25
  • 打赏
  • 举报
回复
我就是先解User.hbm.xml的,而且也正常通过了.但是到了LoginUser就不行了
禽兽v5 2004-11-25
  • 打赏
  • 举报
回复
如果你使用SchemaExport时用了--config=/hibernate.cfg.xml,那么你在该文件中把被引用的类的配置文件放前面就可以了。比如

<mapping resource="User.hbm.xml"/>
<mapping resource="LoginUser.hbm.xml"/>
禽兽v5 2004-11-25
  • 打赏
  • 举报
回复
LoginUser.hbm.xml
User.hbm.xml

解析的时候,先解析LoginUser再解析User。而此时User尚未解析,SchemaExport找不到User类,必然报错。
loverisyour 2004-11-25
  • 打赏
  • 举报
回复
你这里用的外键关联方式,User.hbm.xml是不是也需要指定一下,我没试过呀,不过你可以试一下呀
:)
yping2000 2004-11-25
  • 打赏
  • 举报
回复
同上,,关注

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧