在父/子应用程序中扩展ORM持久性CFC

时间:2013-04-13 09:37:51

标签: orm coldfusion cfc railo

我正在研究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>

1 个答案:

答案 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>