更新時間:2022-01-06 10:02:59 來源:動力節點 瀏覽1067次
介紹
O/R 工具的一個典型問題是數據類型不匹配:域模型中的類具有布爾類型的屬性,但相應的數據庫表將此屬性存儲在BIT或 int類型的列中。
這個例子解釋了 OJB 如何允許你定義 FieldConversions來正確轉換類型和值。
此示例的源代碼包含在 OJB 源代碼分發中并駐留在測試包 org.apache.ojb.broker 中。
問題
測試類 org.apache.ojb.broker.Article包含一個布爾類型的屬性 isSelloutArticle:
public class Article implements InterfaceArticle
{
protected int articleId;
protected String articleName;
// maps to db-column Auslaufartikel of type int
protected boolean isSelloutArticle;
...
}
對應表使用 int 列 ( Auslaufartikel ) 來存儲此屬性:
CREATE TABLE Artikel (
Artikel_Nr INT PRIMARY KEY,
Artikelname CHAR(60),
Lieferanten_Nr INT,
Kategorie_Nr INT,
Liefereinheit CHAR(30),
Einzelpreis DECIMAL,
Lagerbestand INT,
BestellteEinheiten INT,
MindestBestand INT,
Auslaufartikel INT
)
解決方案
OJB 允許使用預定義(或自寫)的 FieldConversions 進行適當的映射。該 FieldConversion接口聲明了兩個方法: javaToSql(...)和 sqlToJava(...) :
/**
* FieldConversion 聲明了一個協議,用于類型和值
* 持久類屬性和
RDBMS的列之間的轉換。
* 默認實現不修改其輸入。
* OJB 用戶可以使用預定義的實現,也可以
* 構建他們自己的執行任意映射的轉換。
* 映射必須在 xml 存儲庫中定義
* 在字段描述符中。
*
* @author Thomas Mahler
*/
public interface FieldConversion extends Serializable
{
/**
* 將 Java 對象轉換為其 SQL
* 掛件,用于插入和更新
*/
公共抽象對象 javaToSql(Object source) 拋出 ConversionException;
/**
* 將 SQL 值轉換為 Java 對象,用于 SELECT
*/
public abstract Object sqlToJava(Object source) throws ConversionException;
}
方法 FieldConversion.sqlToJava()是一個回調,當從 JDBC 結果集中讀入對象屬性時,它會在 OJB 代理中調用。如果 OJB 檢測到為持久類屬性聲明了 FieldConversion,則它使用 FieldConversion 來執行此屬性的編組。
對于上面提到的將 int 列映射到 boolean 屬性的問題,我們可以使用預定義的 FieldConversion Boolean2IntFieldConversion。看看代碼,看看它是如何工作的:
public class Boolean2IntFieldConversion 實現 FieldConversion
{
private static Integer I_TRUE = new Integer(1);
私有靜態整數 I_FALSE = 新整數(0);
私有靜態布爾 B_TRUE = 新布爾(真);
私有靜態布爾 B_FALSE = 新布爾(假);
/**
* @see FieldConversion#javaToSql(Object)
*/
public Object javaToSql(Object source)
{
if (source instanceof Boolean)
{
if (source.equals(B_TRUE))
{
return I_TRUE;
}
其他
{
返回 I_FALSE;
}
}
else
{
返回源;
}
}
/**
* @see FieldConversion#sqlToJava(Object)
*/
public Object sqlToJava(Object source)
{
if (source instanceof Integer)
{
if (source.equals(I_TRUE))
{
return B_TRUE;
}
else
{
返回 B_FALSE;
}
}
其他
{
返回源;
}
}
}
org.apache.ojb.broker.accesslayer.conversions 包中定義了其他有用的標準轉換 :當然,可以使用轉換在java.sql.date和 java.util.date之間進行映射 。一個非常有趣的轉換是 Object2ByteArrFieldConversion 它允許在 varchar 列中存儲內聯對象!
回到我們的例子,只剩下一件事要做:我們必須告訴 OJB為文章類使用正確的 FieldConversion。這是在 XML 存儲庫文件中完成的。該字段描述符 允許定義轉換屬性聲明完全限定 FieldConversion類:
<!-- test.ojb.broker.Article 的定義 -->
<class-descriptor
class="org.apache.ojb.broker.Article"
proxy="dynamic"
table="Artikel"
> ...
<field-描述符
名稱="isSelloutArticle"
column="Auslaufartikel"
jdbc-type="INTEGER"
conversion="org.apache.ojb.broker.accesslayer.conversions.Boolean2IntFieldConversion"
/>
...
</class-descriptor>
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習