Kodo 由 Solarmetric 開發,BEA 收購後整合入 WebLogic,後開源為 Apache OpenJPA 核心基因。Kodo 4.0 (2006) 同步支援 **JPA 1.0 (EJB 3 持久化規範)** 與 **JDO 2.0**,以「零 XML、全註解、可嵌入、可集成」定位輕量級持久層方案。雖歷史產品,其設計哲學仍具參考價值:
@Entity、@Table、@Id、@Column、@GeneratedValue 完整對標 JPA 標準。%KODO_HOME%,配置 kodocmd.cmd 環境變量org.vivianj.kodo.examples.beans.Bookpackage org.vivianj.kodo.examples.beans;
import javax.persistence.*;
@Entity(name = "Book")
@Table(name = "BOOKS")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int id;
@Basic
@Column(name = "NAME", length = 100)
private String name;
// Getter/Setter 省略...
}
註解解析:@Inheritance(TABLE_PER_CLASS) 映射繼承層級為每類一表;GenerationType.IDENTITY 依賴 MySQL 自增主鍵;字段名大寫增強跨資料庫可移植性。
META-INF/persistence.xml + kodo.xml<!-- persistence.xml -->
<persistence>
<persistence-unit name="kodo-demo">
<provider>kodo.persistence.PersistenceProviderImpl</provider>
<class>org.vivianj.kodo.examples.beans.Book</class>
<properties>
<property name="kodo.ConnectionURL" value="jdbc:mysql://localhost:3306/kodo"/>
<property name="kodo.ConnectionDriverName" value="com.mysql.jdbc.Driver"/>
<property name="kodo.ConnectionUserName" value="root"/>
<property name="kodo.ConnectionPassword" value="password"/>
</properties>
</persistence-unit>
</persistence>
<!-- kodo.xml (Kodo 專屬擴展) -->
<kodo>
<license>您的 30 天試用 License Key</license>
<log>log4j</log> <!-- 整合 Log4j 輸出 SQL 等日誌 -->
</kodo>
> cd %KODO_HOME%\bin
> kodocmd.cmd
> set CLASSPATH=%CLASSPATH%;C:\mysql-connector-java-3.1.8-bin.jar
> javac C:\KodoExamples\org\vivianj\kodo\examples\beans\*.java
> kodoc C:\KodoExamples\org\vivianj\kodo\examples\beans\*.java <!-- 位元組碼增強 -->
> mappingtool C:\KodoExamples\org\vivianj\kodo\examples\beans\*.java <!-- 自動建表 -->
增強器作用:為實體類注入持久化感知代碼,生成 Book$pcSubclass 子類,實現透明延遲加載與髒檢查。
Test.javaEntityManagerFactory emf = Persistence.createEntityManagerFactory("kodo-demo");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Book book = new Book();
book.setName("Kodo 入門");
em.persist(book);
em.getTransaction().commit();
em.close();
emf.close();
<project name="kodo-demo" default="build">
<path id="build.classpath">
<fileset dir="${kodo.home}/lib" includes="*.jar"/>
<pathelement path="C:/mysql-connector-java-3.1.8-bin.jar"/>
</path>
<taskdef name="kodoc" classname="kodo.ant.PCEnhancerTask" classpathref="build.classpath"/>
<taskdef name="mappingtool" classname="kodo.jdbc.ant.MappingToolTask" classpathref="build.classpath"/>
<target name="enhance">
<kodoc>
<classpath refid="build.classpath"/>
<fileset dir="src" includes="**/*.class"/>
</kodoc>
</target>
<target name="create-schema" depends="enhance">
<mappingtool>
<classpath refid="build.classpath"/>
<fileset dir="src" includes="**/*.class"/>
<arg value="-action"/>
<arg value="create"/>
</mappingtool>
</target>
</project>
關鍵修復:原版 MappingToolTask 使用錯誤 ClassLoader 導致 Eclipse 執行失敗,需覆寫 run() 調用傳入 MappingTool.class.getClassLoader()。
| 能力 | 支援程度 | 備註 |
|---|---|---|
| JPA 1.0 / JDO 2.0 | 完整 | 雙標準同源實現 |
| 查詢語言 | JPQL + JDOQL + SQL | 支援原生 SQL 查詢映射實體 |
| 二級緩存 | 內建 + Tangosol Coherence 整合 | 分散式緩存選項 |
| 鎖機制 | 樂觀鎖 + 悲觀鎖 | @Version / LockModeType |
| Schema 生成 | DDL 自動建表/更新/驗證 | mappingtool / schemaTool |
| 遠程/分離實體 | 支援 | detach/merge 模式 |
| 監控/調優 | Kodo Management Console | SQL 分析、緩存命中率、鎖競爭視覺化 |
provider 改為 org.apache.openjpa.persistence.PersistenceProviderImpl 或 org.hibernate.jpa.HibernatePersistenceProvider。kodo.* 前綴屬性需對應修改為目標提供商屬性 (如 openjpa.*, hibernate.*)。openjpa-maven-plugin);Hibernate 採用運行時代理 (CGLib/ByteBuddy) 無需增強。Kodo 以「標準先行、增強編譯、雙模運行」展現了 JPA 參考實現的教科書級架構。雖產品生命週期已轉入 OpenJPA/Hibernate,但其「註解驅動映射、編譯期增強、Schema 自動化、標準化配置」四大設計原則,仍是現代持久層框架 (Hibernate 6、EclipseLink、DataNucleus) 的共同基因。理解 Kodo,即洞悉 JPA 生態的核心演進邏輯。