我正在研究CFML(Railo)中的父/子应用程序结构,我正在努力扩展我的持久性(ORM)CFC。
我希望我的持久性CFC能够存在于父应用程序中。它们将包含各种属性,以及一些处理核心功能的函数。
在我的子应用程序中,我想扩展ORM CFC声明任何子应用程序特定属性,我希望能够添加特定于子应用程序需求的新功能,以及覆盖任何子应用程序核心功能(如果需要),无需触及父应用程序的CFC中的代码。
子应用程序使用自己的数据源,因此我希望在应用程序启动时看到子数据库中生成的ORM表。如果我启动父应用程序(它独立运行并拥有自己的数据源),我可以看到在那里生成的表没有问题。但是,如果我启动子应用程序,则不会生成表(在任一数据库中)。
我尝试将mappedSuperclass='true'
添加到父级CFC并在子应用程序中创建扩展父级CFC的CFC。
我还尝试将父应用程序的ORM文件夹添加到ORM设置中的CFCLocation文件夹数组中。
我能够用作ORM工作的唯一指示是查看表是否在数据库中生成。如果有另一种方式我可以看到ORM CFC是否正常工作,我很乐意听到它!
以下是一些要查看的代码:
父image.cfc
<cfcomponent persistent="true" entityname="Image" table="tblImages_Base" extends="com.orm.SimpleBasePersistentObject" mappedSuperClass="true">
<!--- Identifier --->
<cfproperty name="sImageUUID" fieldtype="id" generator="assigned" setter="false" />
<!--- Properties --->
<cfproperty name="dtDateCreated" ormtype="timestamp" setter="false" />
<cfproperty name="dtLastUpdated" ormtype="timestamp" setter="false" />
<cfproperty name="sFileName" ormtype="string" />
<cfproperty name="iFileSize" ormtype="int" default="0" dbdefault="0" />
<cfproperty name="iWidth" ormtype="int" default="0" dbdefault="0" />
<cfproperty name="iHeight" ormtype="int" default="0" dbdefault="0" />
<cfproperty name="sImageFolder" ormtype="string" dbdefault="" />
<cfproperty name="Active" ormtype="boolean" default="0" dbdefault="0" notnull="true" />
<!--- Non persistant properties --->
<cfproperty name="sImagePath" type="string" persistent="false" />
<cfproperty name="sDefaultImageLocation" persistent="false" />
<!--- Many Images can have one image type --->
<cfproperty name="ImageType"
fieldtype="many-to-one"
cfc="ImageType"
fkcolumn="fk_sImageType"
fetch="join"
/>
</cfproperty>
</cfcomponent>
Sub image.cfc
<cfcomponent persistent="true" entityname="Image" table="tblImages_Base" extends="core.orm.Image">
</cfcomponent>
答案 0 :(得分:0)
您当然可以使用mappedSuperClass="true"
继承(单个或多个),但父CFC不能是持久的,即mappedSuperClass="true"
和persistent="true"
是互斥的。
我建议您设置一个“更高”级别的模型,该模型定义了您希望能够扩展的基本实体。添加mappedSuperClass="true"
,然后使用persistent="false"
并执行不指定表格。
在您的父应用程序和子应用程序中,您将创建扩展这些超类的持久性CFC。我知道这不是你所追求的,因为子应用程序不会从父应用程序继承,但它确实允许它们共享公共属性/方法。
请注意,您不应在超类中定义标识符属性:需要在每个持久性CFC中明确执行。
“超级”cfc的位置并不重要 - 只要您的父级和子级应用可以访问它们。无需将该位置添加到ORM设置中。假设您将它们存储在由“library”映射的名为“library”的文件夹中:
<强> /library/Image.cfc 强>
<cfcomponent entityname="Image" persistent="false" mappedSuperClass="true" hint="I define common properties/methods and can be extended by other ORM components">
<!--- Common Properties--->
<cfproperty name="dtDateCreated" ormtype="timestamp" setter="false" />
<cfproperty name="dtLastUpdated" ormtype="timestamp" setter="false" />
<cfproperty name="sFileName" ormtype="string" />
...etc
</cfcomponent>
<强> /apps/parent/Image.cfc 强>
<cfcomponent entityname="Image" extends="library.Image" persistent="true" table="tblImages_Base">
<!--- Identifier --->
<cfproperty name="sImageUUID" fieldtype="id" generator="assigned" setter="false" />
...
</cfcomponent>
<强> /apps/child/Image.cfc 强>
<cfcomponent entityname="Image" extends="library.Image" persistent="true" table="tblImages_Base">
<!--- Identifier --->
<cfproperty name="sImageUUID" fieldtype="id" generator="assigned" setter="false" />
...
</cfcomponent>