hbm2java (Hibernate Extensions 組件) 依據 .hbm.xml 映射檔生成 Java 持久化類別 (POJO)。比 SchemaExport (生成 DDL) 簡單得多,適合「先建模、後生成碼」工作流。
hibernate-extensions.jar 含 Hbm2JavaTask)所有 JAR 放入專案 lib/ 目錄。
Payment/
├── build.xml
├── hibernate.codegen.xml
├── log4j.properties
├── lib/ ← 所有 jar
├── hbm/
│ └── payment/
│ └── Payment.hbm.xml
└── src/ ← 生成的 Java 碼輸出目錄
<project name="hbm2java-demo" basedir="." default="generate">
<path id="classpath">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="generate">
<taskdef name="hbm2java"
classname="net.sf.hibernate.tool.hbm2java.Hbm2JavaTask"
classpathref="classpath"/>
<hbm2java output="src" config="hibernate.codegen.xml">
<fileset dir="hbm">
<include name="**/*.hbm.xml"/>
</fileset>
</hbm2java>
</target>
</project>
<codegen>
<generate renderer="net.sf.hibernate.tool.hbm2java.BasicRenderer"/>
</codegen>
BasicRenderer 產生標準 getter/setter、toString()、equals()/hashCode() (基於主鍵)。
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
<hibernate-mapping>
<class name="payment.Payment" table="PAYMENT">
<id name="id" type="long" column="PAYMENT_ID">
<generator class="native"/>
</id>
<property name="amount" type="long" column="AMOUNT"/>
</class>
</hibernate-mapping>
關鍵:class 屬性 name="payment.Payment" 決定生成類別的**包名與類名**,輸出路徑為 src/payment/Payment.java。
$ ant generate
Buildfile: build.xml
generate:
[hbm2java] Generating payment/Payment.java
BUILD SUCCESSFUL
檢查 src/payment/Payment.java:
package payment;
public class Payment {
private Long id;
private long amount;
// 標準 getter/setter, equals, hashCode, toString
}
| 問題 | 解決 |
|---|---|
| 生成碼包名錯誤 | 映射檔 class name 必須含完整包名,如 com.myapp.model.User |
| 想自訂生成模板 | 實作 Renderer 介面或繼承 BasicRenderer 覆寫方法,配置 generate renderer="..." |
| 需生成 JDK 5 語法 (Generics, Annotation) | 使用 net.sf.hibernate.tool.hbm2java.Java5Renderer (Hibernate 3.2+) |
| 映射檔分散多模組 | fileset dir 指向共同父目錄,**/*.hbm.xml 遞歸掃描 |
.hbm.xmlant generate 產生 POJOtoString 等// Generated 標記)hbm2java 讓「映射檔為主、Java 碼為從」成為可行流程,減少手寫 POJO 錯誤,保持映射與類別同步。配合 Ant 整合建置流程,一鍵生成,效率倍增。