如何使用 maven 配置 hibernate-tools 以生成 hibernate.cfg.xml、*.hbm.xml、POJO 和 DAO

Posted

技术标签:

【中文标题】如何使用 maven 配置 hibernate-tools 以生成 hibernate.cfg.xml、*.hbm.xml、POJO 和 DAO【英文标题】:How to configure hibernate-tools with maven to generate hibernate.cfg.xml, *.hbm.xml, POJOs and DAOs 【发布时间】:2011-02-20 02:22:28 【问题描述】:

谁能告诉我如何强制 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 并运行目标 hbm2cfgxmlhbm2hbmxml。我也不再在这些目标中使用outputDirectoryconfigurationfile

因此,文件 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 并打包项目以用作从业务层生成的持久层组件。这也是你的意思吗?

【问题讨论】:

【参考方案1】:

有关如何在不使用 hibernate3-maven-plugin 的情况下将 Hibernate 工具与 maven 一起使用的示例,请查看 this post。这个想法是用 Maven 运行 Hibernate 工具 Ant 任务。这种方法使您可以完全控制该过程。

【讨论】:

【参考方案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 (默认生成它们的位置)复制到 target/classes/package/name (hibernate-tools 在哪里寻找它们),但在我的情况下它们不是(这表明我做错了什么)。因此,如果有人知道我做错了什么,请告诉我。否则就够了。

有一件事不起作用:包名称未在生成的 POJO 和 DAO 中使用:但我为此 here 创建了另一个线程。

更新:好的,现在我终于明白了。缺少包名称的问题在于hbm2hbmxml 目标的配置。我错过了 componentPropertiespackagename 那里,所以生成的hbm.xml 错过了完全分类的类名。我更新了上面的pom,现在可以正常工作了。不过,关于将hbm.xml 文件显式复制到target/classes 文件夹的问题仍然存在。

【讨论】:

【参考方案3】:

如何配置 hbm2cfgxml 以使 hibernate.cfg.xml 如下所示 (...)

我有一个使用hbm2cfgxml 的项目,而&lt;mapping resource="..."/&gt; 条目确实反映了hbm.xml 路径中的包名。所以很明显你这边有问题。这里有几点说明:

我会在generate-resources 阶段绑定hbm2cfgxml,你不会生成源代码 我不会在src/main/resources 中生成文件,而是在target/classses 中生成文件(为什么要将生成的东西放在源代码树中,你需要clean 来清理它)。 有一个错字,是configurationfile,不是configurationFile,而是... 为什么hbm2cfgxml 的配置中有&lt;configurationfile&gt;?你想在这里生成它...我会删除它。

更新:你应该把连接数据库所需的信息放在src/main/resources/database.properties(这是propertyfile属性的默认值),而不是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

正如我所说,删除 src/main/resources/hibernate.cfg.xml 文件,你想生成它。

有没有办法告诉 maven 在执行 hbm2java 之前将资源复制到目标文件夹? (...)

hbm2java 目标在执行自身之前调用生命周期阶段流程资源的执行(来自文档)。所以这是默认行为,并在 hibernate3:hbm2javagenerate-sources if hbm2java 绑定到它时发生。

【讨论】:

感谢帕斯卡的发言。我将执行移至生成资源,纠正了错字。 1.如果不是通过hibernate.cfg.xml(或hibernate.properties),我应该如何配置hibernate-tools的用户和密码?这里的想法是,正在读取 hibernate.cfg.xml,并在数据模型发生任何更改时进行更新。有没有更优化的方法?所有其他选项迫使我在 2 个具有不同语法的单独文件中维护相同的配置。关于我的第二个问题,也感谢您的回答。关于路径/到/映射的主要问题仍然悬而未决。

以上是关于如何使用 maven 配置 hibernate-tools 以生成 hibernate.cfg.xml、*.hbm.xml、POJO 和 DAO的主要内容,如果未能解决你的问题,请参考以下文章

maven中使用freemarker,如何配置需要哪些配置文件

如何在Maven中配置Spring依赖

如何在myeclipse中使用maven

如何配置 Eclipse 构建路径以使用 Maven 依赖项?

如何配置 maven 以使用 servlet 3

用maven建一个Hello World项目,maven初使用,maven如何使用