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

时间:2010-05-16 13:35:40

标签: hibernate maven-2 hibernate-tools

任何人都可以告诉我如何强制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并将项目打包以用作业务层中生成的持久层组件。这也是你的意思吗?

3 个答案:

答案 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:hbm2javagenerate-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任务。这种方法使您可以完全控制该过程。