【问题标题】:How to configure hbm2java and hbm2dao to add packagename to generated classes如何配置 hbm2java 和 hbm2dao 以将包名添加到生成的类
【发布时间】:2011-02-20 08:55:00
【问题描述】:

我正在尝试使用 maven 配置 hbm2java 以生成 POJO 类和 DAO 对象。我正在处理的问题之一是未生成包名称。为此,我正在使用以下 pom:

<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>

但生成的代码以以下开头:

// default package
// Generated 2010-05-17 13:11:51 by Hibernate Tools 3.2.2.GA

/**
 * Messages generated by hbm2java
 */
public class Messages  implements java.io.Serializable {

有没有办法强制 maven 生成 packagename 中定义的 package 部分?

更新:

这是我的 hibernate.cfg.xml,也是由 hibernate-tools (hbm2cfgxml) 自动生成的:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.max_statements">50</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.timeout">1800</property>
        <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
        <property name="hibernate.connection.password">password</property>
        <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/db</property>
        <property name="hibernate.connection.username">username</property>
        <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <mapping resource="package/name/Messages.hbm.xml" />
    </session-factory>
</hibernate-configuration>

【问题讨论】:

  • 你的 hibernate.cfg.xml 文件是什么样的。文件是否有可能覆盖设置?另外,请注意您指定的配置文件拼写错误,hibernane.cfg.xml。我不确定这是不是故意的。
  • 在复制粘贴和格式化 StackOverflow 的代码时出现拼写错误 - 但谢谢。我添加了我的 hibernate.cfg.xml。

标签: hibernate maven-2 hibernate-tools hbm2java


【解决方案1】:

以防万一,这里是一个用于自下而上方法的 hibernate3-maven-plugin 的工作配置:

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>hibernate3-maven-plugin</artifactId>
    <version>2.2</version>
    <executions>
      <execution>
        <id>generate-xml-files</id>
        <phase>generate-resources</phase>
        <goals>
          <goal>hbm2hbmxml</goal>
          <goal>hbm2cfgxml</goal>
        </goals>
      </execution>
      <execution>
        <id>generate-entities</id>
        <phase>generate-sources</phase>
        <goals>
          <goal>hbm2java</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <components>
        <component>
          <name>hbm2hbmxml</name>
          <implementation>jdbcconfiguration</implementation>
          <outputDirectory>target/classes</outputDirectory>
        </component>
        <component>
          <name>hbm2cfgxml</name>
          <implementation>jdbcconfiguration</implementation>
          <outputDirectory>target/classes</outputDirectory>
        </component>
        <component>
          <name>hbm2java</name>
          <implementation>configuration</implementation>
          <outputDirectory>target/generated-sources/hibernate3</outputDirectory>
        </component>
      </components>
      <componentProperties>
        <propertyfile>src/main/resources/database.properties</propertyfile>
        <jdk5>true</jdk5>
        <ejb3>false</ejb3>
        <packagename>com.mycompany.myapp</packagename>
        <format>true</format>
        <haltonerror>true</haltonerror>
      </componentProperties>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.5.3.0_1</version>
      </dependency>
    </dependencies>
  </plugin>

这是我的src/main/database.properties文件的内容:

hibernate.connection.driver_class=org.apache.derby.jdbc.EmbeddedDriver
hibernate.connection.url=jdbc:derby:./derbyDBs/EMPLDB
hibernate.connection.username=APP
hibernate.connection.password=APP
hibernate.dialect=org.hibernate.dialect.DerbyDialect

#workaround for http://opensource.atlassian.com/projects/hibernate/browse/HBX-1145
hibernate.connection.autocommit=true 

这个设置:

  1. generate-resources 期间在target/classes(带有包)中生成*.hbm.xml
  2. target/classes 中生成一个hibernate.cfg.xml,其中包含映射文件的条目。
  3. 根据target/generated-sources/hibernate3 中的映射生成实体(我建议对生成的源遵循target/generated-sources/&lt;tool&gt; 约定,以便IDE 自动检测它们)。

这是clean compile 对包含两个表的示例数据库的结果:

$ mvn 清理编译 ... $树目标/ 目标/ ├── 班级 │   ├── com │   │   └── 我的公司 │   │   └── myapp │   │   ├── Department.class │   │   ├── Department.hbm.xml │   │   ├── Employee.class │   │   └── Employee.hbm.xml │   ├── database.properties │   └── hibernate.cfg.xml └── 生成源 └──休眠3 └── com └── 我的公司 └── myapp ├── 部门.java └── 员工.java

【讨论】:

  • 不错,比我的简单:)。您是否知道为什么在 generate-sources 目标执行之前 hbm.xml 文件没有从 generate-sources/hibernate3/generated-mappings 自动复制到目标/类?我看到您还强制 maven 将这些文件直接放在 target/classes 文件夹中。有没有办法以某种方式配置它?
  • @mmm 我不知道为什么它们不是(插件应该添加这个目录作为资源目录到pom)。不过,应该可以使用 Build Helper 插件(参见Usage 页面)。但这会更冗长,我看不到真正的好处。所以,由于我使用的解决方案很有效,我从未尝试过另一种方式。
【解决方案2】:

好的,我想通了。我把答案here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2018-05-23
    • 2011-01-21
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多