2

我正在研究 CFML (Railo) 中的父/子应用程序结构,并且正在努力扩展我的持久性 (ORM) CFC。

我希望我的持久性 CFC 存在于父应用程序中。它们将包含各种属性,以及一些处理核心功能的函数。

在我的子应用程序中,我想扩展声明任何子应用程序特定属性的 ORM CFC,并且我希望能够添加特定于子应用程序需求的新功能,以及覆盖任何核心功能,如果需要,无需触及父应用程序的 CFC 中的代码。

子应用程序使用自己的数据源,因此我希望在应用程序启动时看到子应用程序数据库中生成的 ORM 表。如果我启动父应用程序(独立运行并拥有自己的数据源),我可以毫无问题地看到那里生成的表。但是,如果我启动子应用程序,则不会生成表(在任一数据库中)。

我尝试添加mappedSuperclass='true'到父 CFC 并在扩展父 CFC 的子应用程序中创建 CFC。我还尝试将父应用程序的 ORM 文件夹添加到 ORM 设置中的 CFCLocation 文件夹数组中。

我唯一可以用来作为 ORM 正在工作的指示,就是查看表是否是在数据库中生成的。如果有另一种方法可以查看 ORM CFC 是否正常工作,我很想听听!

这是一些要查看的代码:

父图像.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>

子图像.cfc

<cfcomponent persistent="true" entityname="Image" table="tblImages_Base" extends="core.orm.Image">
</cfcomponent>
4

1 回答 1

0

您当然可以使用 进行继承(单个或多个)mappedSuperClass="true",但父 CFC(s) 不能持久,即mappedSuperClass="true"互斥persistent="true"

我建议您设置一个“更高”级别的模型,该模型定义了您希望能够扩展的基本实体。添加mappedSuperClass="true"但随后使用persistent="false"并且指定表。

然后,在您的父应用程序和子应用程序中,您将创建扩展这些超类的持久 CFC。我知道这不是您所追求的,因为子应用程序不会从父应用程序继承,但它确实允许它们共享通用属性/方法。

请注意,您不应该在超类中定义标识符属性:这需要在每个持久 CFC 中显式完成。

“超级”cfcs 的位置并不重要 - 只要您的父应用程序和子应用程序可以访问它们。无需将该位置添加到您的 ORM 设置中。假设您将它们存储在由“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>
于 2013-04-16T08:45:45.797 回答