是否可以跨应用程序重用ColdFusion ORM对象?
例如,我在名为app1的文件夹中设置了一个名为app1的启用ORM的应用程序。我创建了一个department.cfc,它对应于一个部门数据库表:
<cfcomponent>
<cfset this.name = "app1">
<cfset this.ormenabled = "true">
<cfset this.ormSettings = {
datasource = "myDS",
schema = "mySchema",
dialect = "Oracle10g",
logSQL = "false"
}>
我可以加载和转储CFM文件中的内容:
<cfset item = EntityLoad("department")>
<cfdump var="#item#">
然后,我在名为app2的文件夹中设置了一个名为app2的相同的启用ORM的应用程序。我在那里创建了一个department.cfc,它扩展了app1中的department.cfc:
<cfcomponent persistent="true" extends="my.path.app1.department">
</cfcomponent>
当我尝试加载和转储内容时,出现错误:
系统尝试在代码或某些系统代码中使用未定义的值,这通常表示编程错误。 Null Pointers是未定义值的另一个名称。
我已经确认路径是正确的。例如。我能够使用CreateObject实例化对象:
<cfset item = CreateObject("component","my.path.app1.department")>
<cfdump var = "#item#">
我希望我可以引用单个CFC并重新使用该对象,但除非我遗漏了某些内容,否则可能需要在app2中重新创建该对象。
答案 0 :(得分:1)
CFC(实体)可以在两个不同的应用程序中实例化,每个应用程序都使用自己的ORM。您需要做的就是将它们放在服务器上的这个中心位置,并可能创建一个特定于应用程序/全局的文件映射,然后您可以创建新的实例。然而,最方便的方法是通过application.cfc中的“this.ormSettings”变量,因为你可以在一个地方完成所有这些。
例如:
component displayname="Application"
{
this.ormSettings = {
cfclocation = [
"/full/path/to/cfc/directory",
"Entity",
"/a/relative/path"
]
};
this.mappings["/Entity"] = "full/dir/path/to/another/cfc/directory/called/whatever";
}
在任何其他目录之前,将搜索这些位置中的每个位置以匹配CFC,因此通过明确定义它们也可以带来潜在的性能优势。
答案 1 :(得分:0)
当然,您可以让多个应用程序使用相同的“模型”或一组ORM实体CFC,方法是通过映射来访问它们,如AlexP所说。
但是ORM中的继承有点不同。持久性CFC无法扩展另一个持久性CFC(至少不在CF9中)。相反,必须将父CFC标记为“ mappedsuperclass ”,并将持久属性设置为false或删除。然后子持久性CFC应该能够扩展它:
<cfcomponent name="Pet" mappedSuperClass="true" persistent="false">
...
</cfcomponent>
<cfcomponent name="Cat" extends="Pet" persistent="true" table="cats">
...
</cfcomponent>
这显然限制了您在ORM中继承的功能。您不能将Pet本身用作实体,但它对于共享在Cat,Dog和Rabbit实体中可能重复的属性非常有用。