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。值类型没有影响。
EO 使用行锁定系统,其中每次对数据库进行 UPDATE 都会伴随一个 WHERE 子句,其中包含数据的预期原始值。这样,如果数据在初始 FETCH 和后续 UPDATE 之间发生变化,则 UPDATE 失败,并且 EO 可以抛出异常。可以在 Modeler 应用程序中指定用于行锁定的字段集。
如果 String 字段是用于行锁定的字段之一,并且值类型为 'C'(字符流),并且字段的数据大于 255,则 UPDATE 失败。这看起来像是一个错误。
失败会导致错误,例如“com.webobjects.eoaccess.EOGeneralAdaptorException: deleteRowDescribedByQualifierEntity -- com.webobjects.jdbcadaptor.JDBCChannel: 方法无法在数据库中删除行”。