介绍
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>
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习