从版本 11 升级到 ColdFusion 2018 后的 ORM 问题

ORM issue after upgrading to ColdFusion 2018 from version 11

我们从 ColdFusion 11 迁移到 ColdFusion 2018,现在 ORM 破坏了 EntitySave 方法,我们收到以下错误消息。

Error Message - The root cause of this exception was: coldfusion.orm.hibernate.HibernateSessionException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1.

我们有 2 个 class 具有一对多关系,例如 Email.cfc(父)和 EmailItems.cfc(子)。当我们尝试保存 Email.cfc 对象时,hibernate 也会为 EmailItems 创建一个更新查询,这仅在 ColdFusion 2018 中发生。

这里是Email.cfc中定义的属性。

<cfproperty name="EmailItems" 
            lazy="true" 
            fieldtype="one-to-many" 
            inverse="true" 
            fkcolumn="EmailID" 
            cfc="EmailItem" 
            singularName="EmailItem" 
            type="struct" 
            structkeycolumn="EmailItemKey" 
            structkeytype="string" 
            cascade="none"
/>

我们正在使用 inverse,它仍然为子 class 'EmailItems' 创建一个更新查询,这就是失败 EntitySave(Email) 的原因。 ColdFusion 11 一切正常。

终于,我找到了解决这个问题的方法。似乎 inverse="true" 属性与 cf2018 的工作方式与它与 CF2011 的工作方式不同。

经过一些研究发现,默认情况下,在 <cfproperty> 标记中添加级联 属性 用于一对多关系,其值为 UPDATE,这意味着对于任何孤立的子对象它是在数据库级别不存在此对象时尝试更新。

因此,当在我的 <cfproperty> 标签中为一对多关系添加 cascade="save-update" 时,它解决了问题,因为现在它尝试为任何孤立的子对象插入而不是更新。