我们从ColdFusion 11迁移到ColdFusion 2018,现在ORM打破了EntitySave
方法,并且得到了以下错误消息。
错误消息-此异常的根本原因是:coldfusion.orm.hibernate.HibernateSessionException:批处理更新从更新[0]返回意外行数;实际行数:0;预期:1。
我们有2个具有一对多关系的类,例如Email.cfc(父级)和EmailItems.cfc(子级)。当我们尝试保存Email.cfc对象时,休眠也会为EmailItems
创建一个UPDATE查询,而这仅在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"
/>
我们正在使用逆函数,它仍然为子类'EmailItems'创建UPDATE查询,这是失败EntitySave(Email)
的原因。 ColdFusion 11一切正常。
答案 0 :(得分:2)
最后,我找到了解决办法。似乎inverse="true"
属性对cf2018的作用与与CF2011的作用不同。
经过一些研究后发现,默认情况下,<cfproperty>
标记中为一对多关系添加了层叠属性,其值为UPDATE,这意味着对于任何孤立的子对象,它尝试在该对象进行更新时在数据库级别不存在。
因此,当在我的cascade="save-update"
标记中添加<cfproperty>
进行多对多关系时,它可以解决此问题,因为现在它尝试为任何孤立的子对象插入而不是UPDATE。