跳转到内容

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: 方法无法在数据库中删除行”。

华夏公益教科书