TL:博士;
具有外键约束的 CF ORM 组件的正确语法/解决方法/hack 是什么?
ColdFusion + 整数
将变量存储为整数应该是一个简单的编程问题,对吧?在语言的文档中找到适当的函数(如果你不能从圆顶上回忆它),它会说返回:int(owtte)并使用它。
不使用 ColdFusion。
你们中的一些人可能已经意识到 ColdFusion 的各种整数问题,但目前导致我快速脱发的一个问题是,ColdFusion 有时会将您的“整数”存储为字符串、double 或 long。现在,对于大多数用例来说,这不是一个破坏功能的问题,并且经常被忽视/忽略/未被发现。就我而言,例外情况是 ORM 发挥作用的时候。当然,就像任何明智的开发人员一样,我认识到这可能是由于某处的用户错误造成的。
问题
每当 CF 尝试与数据库交互时,就会出现此问题。如果有一个字段是外键并且类型为“整数”,CF 会抛出 Hibernate Exception 并显示以下消息:
java.lang.Integer
而已。有帮助,对吧?我发现这个“错误消息”明确地是您传递到该字段的变量类型,因此如果您错误地将双精度传递到该字段,错误消息将显示为java.lang.Double
.
现在,这似乎与字段本身无关,而与相关组件有关 - 这仅发生在具有将其链接到其他地方的整数字段的外键约束的字段上。
我要做的事情的基本示例:
模板.cfc
component persistent="true" table="template"{
property name="id" type="numeric" sqltype="integer" column="templateID" fieldtype="id" generator="identity";
property name="userID" type="numeric" sqltype="integer" fkcolumn="userID" fieldtype="many-to-one" cfc="User";
property name="lastModified" type="date" sqltype="timestamp" column="lastModified";
}
用户.cfc
component persistent="true" table="user"{
property name="id" type="numeric" sqltype="integer" column="userID" fieldtype="id" generator="identity";
property name="username" type="string" sqltype="nvarchar" column="username";
property name="password" type="string" sqltype="nvarchar" column="password";
}
刷新已更新的 ORM 时会出现问题template.userID
。
我尝试过的事情
- 联系 Adobe CF 支持(我们有一个企业许可证和白金支持,但在一个月内他们无法给我解决方案,甚至除了“它不起作用?”之外的任何信息)
- 将
ormtype
属性添加到身份字段(然后在不起作用时添加外键字段) - 更改
sqltype
属性(我现在认为这仅用于创建表,因为数据库已经到位,所以我们从来不需要) - 使用以下函数的各种组合转换变量:
NumberFormat( var )
- 文档说它返回“一个格式化的数值”,实际上返回一个java.lang.String
LSParseNumber( var )
- 返回一个双精度Int( var )
- 这个很棒:文档说它返回一个integer,作为一个string。实际上返回一个java.lang.Double
Val( var )
- 返回一个双精度javaCast( 'int', var )
- 返回一个整数,它会抛出相同的错误
- 在属性上设置
elementtype
属性(两端) validate
将属性(两端)的属性放宽为“数字”
我怀疑这可能与 Hibernate 和 CF 的组合有关,而不仅仅是 CF,尽管它让人想起 javascript 的怪癖,但我仍然喜欢它。
环境
- 视窗服务器 2012 R2
- ColdFusion 2016(企业版)
- SQL 服务器