首页 > 解决方案 > 从版本 11 升级到 ColdFusion 2018 后的 ORM 问题

问题描述

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

错误消息 - 此异常的根本原因是:coldfusion.orm.hibernate.HibernateSessionException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1。

我们有 2 个具有一对多关系的类,例如 Email.cfc(父)和 EmailItems.cfc(子)。当我们尝试保存 Email.cfc 对象时,hibernate 也会创建一个 UPDATE 查询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,它仍然为子类“EmailItems”创建一个 UPDATE 查询,这是失败的原因EntitySave(Email)。ColdFusion 11 一切正常。

标签: ormcoldfusioncoldfusion-2018

解决方案


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

在做了一些研究后发现,默认情况下,在<cfproperty>标签中为一对多关系添加一个级联属性,其值为 UPDATE,这意味着对于它试图更新的任何孤立子对象,而该对象在数据库级别不存在。

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


推荐阅读