gpt4 book ai didi

java - 如何使用 ColdFusion ORM 存储整数?

转载 作者:行者123 更新时间:2023-12-02 08:47:46 25 4
gpt4 key购买 nike

TL:DR;

对于具有外键约束的 CF ORM 组件,正确的语法/解决方法/黑客是什么?

<小时/>

ColdFusion + 整数

将变量存储为整数应该是一个简单的编程问题,对吗?在该语言的文档中找到相应的函数(如果您无法从圆顶中记忆起它),其中会显示 returns: int (owtte) 并使用它。

ColdFusion 不支持。

你们中的一些人可能已经知道 ColdFusion 的 various issues with integers但目前导致我快速脱发的是 ColdFusion 有时会将你的“整数”存储为字符串、 double 字符串或长字符串。现在,对于大多数用例来说,这不是一个破坏功能的问题,并且经常被忽视/忽略/未被发现。就我而言,异常(exception)是 ORM 发挥作用时。当然,正如任何明智的开发人员所做的那样,我认识到这可能是由于某个地方的用户错误造成的。

<小时/>

问题

每当 CF 尝试与 DB 交互时,就会出现此问题。如果有一个字段是外键并且类型为“整数”,则 CF 会抛出 Hibernate 异常并显示以下消息:

java.lang.Integer

就是这样。有帮助,对吧?我发现这个“错误消息”明确是您传递到该字段的变量类型,因此如果您错误地将 double 值传递到该字段,错误消息将显示为 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";

}

User.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";

}

刷新已更新 template.userID 的 ORM 时会出现问题。

<小时/>

我尝试过的事情

  • 联系 Adob​​e CF 支持(我们拥有具有白金支持的企业许可证,但一个月后他们无法为我提供解决方案,甚至除了“它不起作用?”之外的任何信息)
  • ormtype 属性添加到身份字段(如果不起作用,则添加外键字段)
  • 更改 sqltype 属性(我现在相信 is only for table creation 我们永远不需要它,因为数据库已经就位)
  • 使用以下函数的各种组合来转换变量:
    • NumberFormat( var ) - 文档说它返回“格式化的数字值”,实际上返回一个 java.lang.String
    • LSParseNumber( var ) - 返回 double 值
    • Int( var ) - 这个很棒:文档说它返回一个整数,作为字符串。实际上返回一个java.lang.Double
    • Val( var ) - 返回 double 值
    • javaCast( 'int', var ) - 返回一个整数,这会引发相同的错误
  • 设置属性的 elementtype 属性(两端)
  • 将属性(两端)的 validate 属性放宽为“数字”

我怀疑这可能与 Hibernate 和 CF 的组合有关,而不仅仅是 CF,尽管它有令人想起 javascript 的怪癖,但我仍然喜欢它。

<小时/>

环境

  • Windows Server 2012 R2
  • ColdFusion 2016(企业版)
  • SQL Server

最佳答案

TL:DR;

传递实体,而不是 ID。CF ORM 中引用持久实体 Foo 的外键属性的类型为 Foo 而不是 int。

更多详细信息

过了这么久,Adobe 让我绕过了几个人,直到我找到了一位知道自己在说什么的工程师。事实证明,问题并不在于 ORM 引擎(Hibernate)无法将整数识别为整数,而是如果您有一个引用另一个持久实体的外键,那么您必须传递该实体而不是 ID。

示例(在问题的上下文中)

首先,我从问题中删除了 typesqltype 值,因为前者可以通过 CF 检查数据库来检索(在我的例子中这是很好的) ,但您可能必须显式设置它,特别是当您在 Application.cfc 中关闭 useDBforMapping 时。

其次,我已将 Template 组件中的 userID 属性重命名为 user,因为它可能会帮助那些不能立即理解我上面所说的内容的人传递实体'以更好地可视化它。

模板.cfc

component persistent="true" table="template"{

property name="id" column="templateID" fieldtype="id" generator="identity";
property name="user" fkcolumn="userID" fieldtype="many-to-one" cfc="User";
property name="lastModified" column="lastModified";

}

User.cfc

component persistent="true" table="user"{

property name="id" column="userID" fieldtype="id" generator="identity";
property name="username" column="username";
property name="password" column="password";

}

因此,假设您知道与此模板关联的用户的 ID(例如,他们可能是创建者)。您需要做的是,不要将 ID 传递给 user 属性,而是创建一个 User 组件,然后传递那个

index.cfm

userID = 4; // Example user ID, which we got from somewhere earlier in the code

templateID = 20; // Example template ID, which we got from somewhere earlier in the code

// Create template entity (loading by primary key)
template = EntityLoadByPK( 'Template', templateID );

// To set the user in the Template entity, we must pass a User entity
user = EntityLoadByPK( 'User', userID );

// Only then can we successfully update the template's foreign key property
template.setUser( user );
EntitySave( template );

// Line below is not usually needed, but it forces DB interaction so it's
// useful in the context of this example
ORMFlush();

希望这对遇到同样困惑的其他人有所帮助。

JC

关于java - 如何使用 ColdFusion ORM 存储整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45800432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com