我有一些* .hbm.xml文件放在hibernate.cfg.xml文件的同一文件夹中。现在,我想映射一些其他* .hbm.xml文件,这些文件位于此文件夹的子文件夹中。我怎么能这样做?谢谢!
这是我hibernate.cfg.xml
的一部分:
<hibernate-configuration>
<session-factory name="MySessionFactory">
<!-- some hibernate properties here -->
<!--This below works fine-->
<mapping resource="A.hbm.xml"/>
<!--This doesn't-->
<mapping resource="/dir/B.hbm.xml"/>
</session-factory>
</hibernate-configuration>
这是我的Ant文件的一部分:
<target name="generateHibernateSql">
<taskdef name="SchemaExportTask"
classname="org.hibernate.tool.hbm2ddl.SchemaExportTask"
>
<classpath>
<pathelement location="${build.classes.main.dir}"/>
<pathelement location="${base.configuration.hibernate.dir}"/>
<path refid="build.classpath.lib"/>
</classpath>
</taskdef>
这是我的文件夹结构
${base.configuration.hibernate.dir}
| hibernate.cfg.xml
| A.hbm.xml
|--dir
|---| B.hbm.xml
${build.classes.main.dir}
我首先尝试并失败,因为莫里斯建议,将线路改为
<mapping resource="dir/B.hbm.xml"/>
仍然会出现同样的错误:
Schema text failed: Could not parse mapping document from resource dir/B.hbm.xml
然后我继续尝试添加到我的schemaexpoert中,如Mark建议的那样。然后它甚至不会再找到我的“A.hbm.xml”了。放弃错误:
Schema text failed: Could not parse mapping document from resource A.hbm.xml
我的SchemaExportTask现在看起来像:
<SchemaExportTask
config="${base.configuration.hibernate.dir}\hibernate.cfg.xml"
quiet="no"
text="no"
drop="no"
delimiter=";"
create="yes"
output="${dist.database.dir}\schema-export.sql"
>
<fileset dir="${base.configuration.hibernate.dir}">
<include name="**/*.hbm.xml"/>
</fileset>
</SchemaExportTask>
结论是我真的很蠢。它与处于不同的目录无关。我感到困惑,因为我正在改变测试阶段的两件事,然后我把它归咎于无辜的“目录更改”。很抱歉浪费每个人的时间。
如果有人有兴趣,这就是发生的事情。我使用本地DTD文件进行了一些XSLT转换,并在我的XSL文件中使用相对路径指定了本地DTD文件。但是我将生成的hbm.xml文件放入差异目录 - 因此SchemaExportTask无法再找到DTD文件,并且无法解析新的hbm.xml文件。并且由于一些愚蠢的原因,我认为以下完全不同的错误消息意味着同样的事情....非常感谢Mark提醒我,人们写错误消息是有充分理由的!添加fileset
现在仍然不起作用,但我现在知道阅读错误消息...我相信我很快就会修复它。 =。= ''
Schema text failed: resource: B.hbm.xml not found
Schema text failed: Could not parse mapping document from resource dir/B.hbm.xml
答案 0 :(得分:3)
<mapping resource="dir/B.hbm.xml"/>
答案 1 :(得分:3)
对于Hibernate的一般用法,我同意Maurice建议的改变,但我想我会给出更多的解释。 Hibernate映射文件作为类路径中的资源加载。由于您的类路径上有$ {base.configuration.hibernate.dir},因此您必须提供相对于此的映射文件的路径,因此前/应该被删除。
为了使用ant中的模式导出工具,docs表示您应该将映射文件定义为文件集,而不是期望在类路径中找到它们。见