假设我们有一个Request
基本组件,RequestA
,RequestB
子类使用每个子类的表映射,没有鉴别器。
我们总是entityLoadByPk('Request', someSubclassEntityId)
,该方法会返回RequestA
或RequestB
组件的实例。
不知何故,它今天早上停止了这样的行为,代码根本没有改变。 entityLoadByPk
函数现在返回Request
的实例,而不是派生的组件。
为了确保代码没有改变,我们将整个应用程序复制粘贴到另一个ColdFusion盒子上(运行CF11),它的行为就像我们在CF9盒子上做的那样。
显然,CF9包装盒上必须有一个设置或改变的东西,但我们看了一下我们想到的一切,我们根本找不到任何解释。
即使我们重新启动服务器并清除了我们可以想到的所有可能的缓存(模板缓存,组件缓存,我们也称为ormEvictQueries和ormEvictEntity),问题仍然存在。
以下是ORM设置:
<cfset this.ormSettings = {
dialect = 'MicrosoftSQLServer',
eventHandling = true,
flushAtRequestEnd = false,
logSql = true,
saveMapping = false,
cfcLocation = domainModelLocation
}>
这是一个映射示例(我剥离了不必要的关系):
<!--- IPSRequest.cfc --->
<cfcomponent persistent="true" table="IPSRequest" lazy="no">
<cfproperty name="id" type="numeric" fieldtype="id" column="id" generator="assigned">
</cfcomponent>
<!--- IPSInfoManFileTracerRequest.cfc --->
<cfcomponent
persistent="yes"
extends="IPSRequest"
table="IPSInfoManFileTracerRequest"
joincolumn="ips_request_id">
<!--- The id property was repeated because of a bug --->
<cfproperty name="id" type="numeric" fieldtype="id" column="ips_request_id" generator="assigned">
</cfcomponent>
这是CF9框中生成的映射:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="IPSRequest" lazy="false"
name="cfc:charities.cts.cfc.model.ips.request.IPSRequest" table="IPSRequest">
<id name="id" type="int">
<column length="10" name="id"/>
<generator class="assigned"/>
</id>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="InfoManFileTracerRequest" lazy="true"
name="cfc:CHARITIES.CTS.cfc.model.ips.request.InfoManFileTracerRequest" table="IPSInfoManFileTracerRequest">
<id name="id" type="int">
<column length="10" name="ips_request_id"/>
<generator class="assigned"/>
</id>
</class>
</hibernate-mapping>
这是在CF11盒子上生成的映射,代码相同:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class entity-name="IPSRequest" lazy="false"
name="cfc:charities.cts.cfc.model.ips.request.IPSRequest" table="IPSRequest">
<id name="id" type="int">
<column length="10" name="id"/>
<generator class="assigned"/>
</id>
</class>
</hibernate-mapping>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<joined-subclass entity-name="InfoManFileTracerRequest"
extends="cfc:charities.cts.cfc.model.ips.request.IPSRequest"
lazy="true"
name="cfc:charities.CTS.cfc.model.ips.request.InfoManFileTracerRequest" table="IPSInfoManFileTracerRequest">
<key column="ips_request_id"/>
</joined-subclass>
</hibernate-mapping>
我们可以看到CF9盒子上的映射看起来不正确,但过去使用相同的代码就可以正常工作了。
CF9格式上应用的最新修补程序为hf902-00007.jar
,并于2014年完成。
我必须说我很困惑,不知道会改变什么行为?
修改
我们将CF9盒升级到CF11,尽管我们使用迁移工具导入配置设置,但问题仍然存在。
我们很高兴它确实解决了这个问题,但非常担心不知道影响行为的因素,看看ColdFusion有多么脆弱。
我们的生产箱目前仍在CF9上运行......