跳轉到內容

WebObjects/EOF/建模/常見陷阱和故障排除

來自華夏公益教科書,開放書籍,開放世界

值型別

[編輯 | 編輯原始碼]

在 EOModeler 中,屬性的值型別可以在“表格模式”下編輯屬性時設定。如果“值型別”列不可見,請使用窗格左下角標記為“新增列”的彈出選單。EOModel 中屬性的值型別控制 JDBC 介面卡如何處理與其與資料庫協商的重要細節。值型別通常是一個單字元。

對於值類為 java.lang.Number 的屬性,定義了以下值型別

b = Byte
s = Short
i = Integer
l = Long
f = Float
d = Double
B = java.math.BigDecimal
c = Boolean

由於 java.lang.Number 是一個抽象超類,因此值型別控制 JDBC 介面卡應基於資料庫提供的原始資料例項化的具體類。

它還控制用於向資料庫傳送和檢索資料的 JDBC 方法。對於值類為 java.lang.String 的屬性,定義了以下值型別

<none> = Backwards compatible: Selects S or C option automatically
c = Trimmed for use with fixed length CHAR columns
S = String, will fail when string length is too large
C = Character stream (for large strings)
E = Binary stream (not recommended)

這些值型別影響 java.sql.PreparedStatement 上用於在資料庫和 JDBC 介面卡之間傳輸文字資料的哪些方法。空值型別與 WebObjects v4.5 向後相容,如果文字小於資料庫廣告的最大 varchar 長度,則使用 setString() 方法,如果文字太大,則使用 setCharacterStream() 方法。如果資料庫未能宣傳最大長度,則預設值為 256 個字元。值為 'S' 的值型別使用 setString(),無論文字長度如何。值為 'C' 的值型別使用 setCharacterStream(),無論文字長度如何。值為 'E' 的值型別將文字轉換為原始 UTF-8 位元組,然後使用 setBinaryStream() 將它們儲存在資料庫中的二進位制型別列中。值為 'c' 的值型別告訴介面卡使用 RTRIM 生成 SQL,以去除所有尾隨空格,例如在 CHAR 列中找到的空格。

'S' 適用於大多數文字列。'C' 適用於通常包含大量資料的列。'c' 應在尾隨空格在 CHAR 列中不重要時使用。(如果可能,最好使用 VARCHAR 列。)我們建議不要使用 'E',除非在極端情況下。處理文字編碼問題是資料庫的責任,使用 'E' 通常表明資料庫配置不正確。

對於值類為 NSTimestamp 的屬性,定義了以下值型別

<none> = get/setObject
D = get/setDate
t = get/setTime
T = get/setTimeStamp
M = bug workaround for MSSQLServer JDBC

這些值型別會影響資料在 JDBC 介面卡和資料庫之間的傳輸方式。空值型別在 ResultSet 和 PreparedStatement 上使用 get/setObject()。它假設資料庫可以提供與 java.sql.Timestamp 相容的值。'D' 表示 WebObject 的 JDBC 介面卡應使用 get/setDate。't' 表示 get/setTime(),而 'T' 使用 get/setTimestamp()。'M' 值型別是針對某些 MS SQLServer JDBC 驅動程式中的錯誤的解決方法。它只支援 java.sql.Date。

BLOB 和 CLOB 列由介面卡專門處理以支援 Oracle。值型別沒有影響。

來源: http://developer.apple.com/documentation/LegacyTechnologies/WebObjects/WebObjects_5.1/ReleaseNotes/ReleaseNotes.html

行鎖定

[編輯 | 編輯原始碼]

EO 使用行鎖定系統,其中每次對資料庫進行 UPDATE 都會伴隨一個 WHERE 子句,其中包含資料的預期原始值。這樣,如果資料在初始 FETCH 和後續 UPDATE 之間發生變化,則 UPDATE 失敗,並且 EO 可以丟擲異常。可以在 Modeler 應用程式中指定用於行鎖定的欄位集。

如果 String 欄位是用於行鎖定的欄位之一,並且值型別為 'C'(字元流),並且欄位的資料大於 255,則 UPDATE 失敗。這看起來像是一個錯誤。

失敗會導致錯誤,例如“com.webobjects.eoaccess.EOGeneralAdaptorException: deleteRowDescribedByQualifierEntity -- com.webobjects.jdbcadaptor.JDBCChannel: 方法無法在資料庫中刪除行”。

華夏公益教科書