傳統 JDBC 痛點:
ORM(Object-Relational Mapping)旨在建立對象模型與數據模型的自動映射橋樑,讓開發者面向對象編程,屏蔽 SQL 細節。
ojb-repository.xml)+ Metadata Layer (MOP)。<class-descriptor class="com.ant.Employee" table="EMPLOYEE">
<field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true" autoincrement="true"/>
<field-descriptor name="name" column="NAME" jdbc-type="VARCHAR"/>
</class-descriptor>
<class-descriptor class="com.ant.Executive" table="EXECUTIVE">
<field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true" autoincrement="true"/>
<field-descriptor name="department" column="DEPARTMENT" jdbc-type="VARCHAR"/>
<reference-descriptor name="super" class-ref="com.ant.Employee">
<foreignkey field-ref="id"/>
</reference-descriptor>
</class-descriptor>
sqlMap.xml),充分利用數據庫特有語法,不限於 SQL-92。<sqlMap>
<typeAlias type="com.ant.Test" alias="test"/>
<resultMap class="test" id="result">
<result property="testId" column="TestId"/>
<result property="name" column="Name"/>
<result property="date" column="Date"/>
</resultMap>
<select id="getTestById" resultMap="result" parameterClass="int">
select * from Test where TestId=#value#
</select>
<update id="updateTest" parameterClass="test">
Update Tests set Name=#name#, Date=#date# where TestId=#testId#
</update>
</sqlMap>
createSQLQuery)。FROM Customer 而非 SELECT * FROM table,配合 Dialect 實現數據庫無關性。customer.hbm.xml):<hibernate-mapping>
<class name="com.ant.Customer" table="Customers">
<id name="customerId" column="CustomerId" type="int" unsaved-value="0">
<generator class="sequence">
<param name="sequence">Customers_CustomerId_Seq</param>
</generator>
</id>
<property name="firstName" column="FirstName"/>
<property name="lastName" column="LastName"/>
<set name="addresses" outer-join="true">
<key column="Customer"/>
<one-to-many class="com.ant.Address"/>
</set>
</class>
</hibernate-mapping>
javax.persistence API,避免鎖定具體實現。ORM 解決的是「對象圖 ↔ 關係表」的映射與同步問題。理解其本質(阻抗失配的妥協與權衡)比熟練某框架 API 更重要。從 OJB 到 Hibernate 再到 JPA,核心思想始終是:讓領域模型驅動數據模型,而非相反。