任何人都可以告诉我如何强制maven在使用包路径自动生成的hibernate.cfg.xml文件中映射.hbm.xml文件之前?
我的一般想法是,我想通过maven使用hibernate-tools为我的应用程序生成持久层。所以,我需要hibernate.cfg.xml,然后是所有my_table_names.hbm.xml,最后生成POJO。然而,hbm2java
目标不起作用,因为我将* .hbm.xml文件放入src/main/resources/package/path/
文件夹,但hbm2cfgxml
仅按表名指定映射文件,即:
<mapping resource="MyTableName.hbm.xml" />
所以最大的问题是:如何配置hbm2cfgxml
以便hibernate.cfg.xml如下所示:
<mapping resource="package/path/MyTableName.hbm.xml" />
我的pom.xml目前看起来像这样:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>hbm2cfgxml</id>
<phase>generate-sources</phase>
<goals>
<goal>hbm2cfgxml</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2cfgxml</name>
<implemetation>jdbcconfiguration</implementation>
<outputDirectory>src/main/resources/</outputDirectory>
</component>
</components>
<componentProperties>
<packagename>package.path</packageName>
<configurationFile>src/main/resources/hibernate.cfg.xml</configurationFile>
</componentProperties>
</configuration>
</execution>
</executions>
</plugin>
然后第二个问题:有没有办法告诉maven在执行hbm2java
之前将资源复制到目标文件夹?目前我正在使用
mvn clean resources:resources generate-sources
为此,但必须有更好的方法。
感谢您的帮助。
更新
@Pascal:感谢您的帮助。现在,映射的路径工作正常,但我不知道之前有什么问题。也许在从hibernate.cfg.xml读取数据库配置时会有一些问题(尽管文件会更新)。
我删除了文件hibernate.cfg.xml,将其替换为database.properties并运行目标hbm2cfgxml
和hbm2hbmxml
。我也不再在这些目标中使用outputDirectory
或configurationfile
。
因此,文件hibernate.cfg.xml
和所有*.hbm.xml
将生成到我的target / hibernate3 / generated-mappings /文件夹中,这是默认值。然后我使用以下内容更新了hbm2java
目标:
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
然后我得到以下内容:
[INFO] --- hibernate3-maven-plugin:2.2:hbm2java (hbm2java) @ project.persistence ---
[INFO] using configuration task.
[INFO] Configuration XML file loaded: file:/C:/Documents%20and%20Settings/mmm/workspace/project.persistence/target/hibernate3/generated-mappings/hibernate.cfg.xml
12:15:17,484 INFO org.hibernate.cfg.Configuration - configuring from url: file:/C:/Documents%20and%20Settings/mmm/workspace/project.persistence/target/hibernate3/generated-mappings/hibernate.cfg.xml
12:15:19,046 INFO org.hibernate.cfg.Configuration - Reading mappings from resource : package.name/Messages.hbm.xml
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2java (hbm2java) on project project.persistence: Execution hbm2java of goal org.codehaus.mojo:hibernate3-maven-plugin:2.2:hbm2java failed: resource: package/name/Messages.hbm.xml not found
我该如何处理?当然我可以补充一下:
<outputDirectory>src/main/resources/package/name</outputDirectory>
到hbm2hbmxml
目标,但我认为这不是最佳方法,或者是它?有没有办法让所有生成的代码和资源远离src/
文件夹?
我认为,这种方法的目标不是在我的src / main / java或/ resources文件夹中生成任何源,而是将生成的代码保存在目标文件夹中。由于我普遍同意这一观点,我想继续执行最终执行hbm2dao
并将项目打包以用作业务层中生成的持久层组件。这也是你的意思吗?
答案 0 :(得分:8)
如何配置hbm2cfgxml以便hibernate.cfg.xml如下所示(...)
我有一个使用hbm2cfgxml
的项目,而<mapping resource="..."/>
条目确实反映了hbm.xml
路径中的包名称。所以你身边显然有些不对劲。以下是一些评论:
hbm2cfgxml
阶段绑定generate-resources
,你没有生成来源src/main/resources
中生成文件,而是在target/classses
中生成文件(为什么要在源代码树中放置生成的内容,你需要clean
来清理它。)configurationfile
,而不是configurationFile
但是...... <configurationfile>
的配置中有hbm2cfgxml
?你想在这里生成它...我会删除它。 更新:您应该在src/main/resources/database.properties
中添加连接到数据库所需的信息(这是propertyfile
属性的默认值),而不是{{1} (删除该文件)。下面的示例src/main/resources/hibernate.cfg.xml
:
database.properties
正如我所说,删除hibernate.connection.driver_class=org.apache.derby.jdbc.ClientDriver
hibernate.connection.url=jdbc:derby://localhost:1527//home/pascal/Projects/derbyDBs/EMPLDB
hibernate.connection.username=APP
hibernate.connection.password=APP
hibernate.dialect=org.hibernate.dialect.DerbyDialect
文件,你想要生成它。
有没有办法告诉maven在执行hbm2java之前将资源复制到目标文件夹? (...)
hbm2java
目标在执行之前调用生命周期阶段流程资源(来自文档)。这是默认行为,如果<{strong> src/main/resources/hibernate.cfg.xml
绑定到hibernate3:hbm2java
或generate-sources
,则会发生。
答案 1 :(得分:2)
好的,我通过强制maven将hbm.xml
文件放入 / target / classes / package / name 文件夹来修复我的问题,所以最后我的pom看起来像这样:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>hbm2cfgxml</id>
<phase>generate-resources</phase>
<goals>
<goal>hbm2cfgxml</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2cfgxml</name>
<implementation>jdbcconfiguration</implementation>
</component>
</components>
<componentProperties>
<packagename>package.name</packagename>
</componentProperties>
</configuration>
</execution>
<execution>
<id>hbm2hbmxml</id>
<phase>generate-resources</phase>
<goals>
<goal>hbm2hbmxml</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2hbmxml</name>
<outputDirectory>target/classes</outputDirectory>
</component>
</components>
<componentProperties>
<packagename>package.name</packagename>
</componentProperties>
</configuration>
</execution>
<execution>
<id>hbm2java</id>
<phase>generate-sources</phase>
<goals>
<goal>hbm2java</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2java</name>
<implementation>configuration</implementation>
</component>
</components>
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
</configuration>
</execution>
<execution>
<id>hbm2dao</id>
<phase>generate-sources</phase>
<goals>
<goal>hbm2dao</goal>
</goals>
<inherited>false</inherited>
<configuration>
<components>
<component>
<name>hbm2dao</name>
<implementation>configuration</implementation>
</component>
</components>
<componentProperties>
<packagename>package.name</packagename>
<configurationfile>target/hibernate3/generated-mappings/hibernate.cfg.xml</configurationfile>
</componentProperties>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>8.4-701.jdbc3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
它运作正常。正如我在其他帖子中看到的那样,在一些早期构建阶段,这些hbm.xml
文件应该从 target / hibernate3 / generated-mappings (默认情况下生成它们)复制到< em> target / classes / package / name (其中hibernate-tools查找它们),但在我的情况下它们不是(这表明我做错了)。所以,如果有人在那里知道我可能做错了什么,请告诉我。否则它就足够了。
有一件事是行不通的:包名称不会在生成的POJO和DAO中使用:但我为此here创建了另一个线程。
更新:好的,现在我终于明白了。缺少包名称的问题出在hbm2hbmxml
目标的配置中。我错过了带有 packagename 的 componentProperties ,因此生成的hbm.xml
错过了完全分类的类名。我更新了上面的pom,现在它工作正常。但是,有关将hbm.xml
文件显式复制到 target / classes 文件夹的问题仍然存在。
答案 2 :(得分:1)
有关如何在maven中使用Hibernate工具的示例,请不要使用hibernate3-maven-plugin检查this post。我的想法是使用Maven运行Hibernate工具Ant任务。这种方法使您可以完全控制该过程。