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}
[Edit]
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>
[Resolved]
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