I have some *.hbm.xml files that are placed in the same folder at the hibernate.cfg.xml file. Now, I want to map some other *.hbm.xml files that are in a subfolder of this folder. How could I do it? Thanks!
here's part of my 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>
This is part of my Ant file:
<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>
here's my folder structure
${base.configuration.hibernate.dir}
| hibernate.cfg.xml
| A.hbm.xml
|--dir
|---| B.hbm.xml
${build.classes.main.dir}
I have first tried and failed as Maurice suggested, changed the line to
<mapping resource="dir/B.hbm.xml"/>
still gives the same error:
Schema text failed: Could not parse mapping document from resource dir/B.hbm.xml
and then I went on to try adding into my schemaexpoert as Mark suggested. It then wouldn't even find my "A.hbm.xml" anymore. Giving off the error:
Schema text failed: Could not parse mapping document from resource A.hbm.xml
My SchemaExportTask now looks like:
<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>
The conclusion is that I was just really stupid. It had nothing to do with being in a different directory. I got confused because I was changing two things at once testing phase and then I blamed it all on the innocent "directory change". Sorry for wasting everyone's time.
If anyone is interested, here was what happened. I did some XSLT translation using a local DTD file, and specified the local DTD file with a relative path in my XSL file. But I put the generated hbm.xml files into a difference directory -- hence SchemaExportTask cannot find the DTD file anymore and failed to parse the new hbm.xml files. And for some stupid reason, I thought the following completely different error messages meant the same thing.... Thanks a lot to Mark for reminding me that people wrote error messages for a good reason! Adding fileset
still doesn't work now, but I now know to read error meassages...I'm sure I'll fix it soon. =.=''
Schema text failed: resource: B.hbm.xml not found
Schema text failed: Could not parse mapping document from resource dir/B.hbm.xml
For general Hibernate usage I agree with change Maurice suggested but thought I would give more of an explanation. Hibernate mapping files are loaded as resources from the classpath. As you have ${base.configuration.hibernate.dir} on your classpath you must give the path of the mapping file relative to this therefore the front / should be removed.
For using the schema export tool from ant the docs say that you should define the mapping files as a fileset rather than expect them to be found on the classpath. See