【问题标题】:Re-using ColdFusion ORM entities/objects across applications?跨应用程序重用 ColdFusion ORM 实体/对象?
【发布时间】:2012-09-25 14:16:30
【问题描述】:

是否可以跨应用程序重用 ColdFusion ORM 对象?

例如,我在名为 app1 的文件夹中设置了一个名为 app1 的启用 ORM 的应用程序。我创建了一个与部门数据库表对应的部门.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 的文件夹中设置了一个相同的启用 ORM 的应用程序 app2。我在那里创建了一个department.cfc,它扩展了app1中的department.cfc:

<cfcomponent persistent="true" extends="my.path.app1.department">
</cfcomponent>

当我尝试加载和转储内容时,出现错误:

系统尝试使用未定义的值,这通常表示您的代码或某些系统代码中存在编程错误。 空指针是未定义值的另一个名称。

我已验证路径正确。例如。我能够使用 CreateObject 实例化对象:

<cfset item = CreateObject("component","my.path.app1.department")>
<cfdump var = "#item#">

我希望我可以引用单个 CFC 并重新使用该对象,但除非我缺少某些东西,否则看起来可能需要在 app2 中重新创建该对象。

【问题讨论】:

  • 您是要获取相同的实例还是只是实例化相同的 cfc?在任何一种情况下,如果不在两个应用程序中定义实体的元数据,就不能从 ORM 角度在单独的应用程序中重用相同的实体。您可以拥有一个库来执行此操作并扩展 application.cfc,同时使用相同的数据源/实体映射等。
  • 我正在尝试实例化同一个 CFC,因为我认为拥有多个具有相同代码的 CFC 是多余的。我喜欢你关于 ORM 库应用程序的想法——我会尝试一下。

标签: orm coldfusion coldfusion-9


【解决方案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,因此通过明确定义它们还有潜在的性能优势。

【讨论】:

  • 谢谢亚历克斯——这正是我想要的!
【解决方案2】:

您当然可以让多个应用程序使用相同的“模型”或一组 ORM 实体 CFC,方法是通过 AlexP 所说的映射来访问它们。

但是继承在 ORM 中的工作方式有点不同。一个持久 CFC 不能扩展另一个持久 CFC(至少在 CF9 中不能)。相反,必须将父 CFC 标记为“ma​​ppedsuperclass”,并将持久属性设置为 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 实体中重复的属性很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多