1

有可能我根本没有做对。

我正在初始化一个对象并将其存储到会话范围中,该对象包含当前登录用户的详细信息。

CFC 称为 Provider,当用户成功登录时,我调用:

session.Provider = New model.Provider().init(loginResult.ProviderID);

我在 CFC 中有一个名为 resetValues 的方法,它将指定的值设置为空字符串,但是一旦我重置了值,我就无法弄清楚如何保存实体。

这是完整的 CFC。我正在尝试保存entitySave( this );,但不工作。关于我应该如何保存(持久)此更改的任何建议?还是我需要完全重新考虑我将如何改变这些价值观?

提前谢谢了。

component persistent="true" table="provider" {
property name="id" fieldtype="id" column="provider_id";
property name="title" ormtype="text";
property name="status" ormtype="integer";
property name="email" ormtype="text";

property name="ext_src" ormtype="text";
property name="ext_src_login1" ormtype="text";
property name="ext_src_login2" ormtype="text";
property name="ext_src_login3" ormtype="text";
property name="ext_src_login4" ormtype="text";

//property name="rooms" fieldtype="one-to-many" cfc="Room" fkcolumn="provider_id";

//init()
public function init(providerID="0"){
    variables.providerID = arguments.providerID;
    return this;
}

//get()
public function get(){
    return entityLoadByPK("Provider",variables.providerID);
}

//resetValues()
public function resetValues(){
    this.setExt_src_login1('');
    this.setExt_src_login2('');
    this.setExt_src_login3('');
    this.setExt_src_login4('');
    entitySave(this);
}

}

我收到以下错误:a different object with the same identifier value was already associated with the session

4

1 回答 1

3

我认为这有几件事是错误的

  1. 不建议将 ORM 实体存储在请求之间持续存在的范围内,您将遇到分离实体的问题(请参阅带有 CF-ORM 的 ColdFusion 9 中要注意的事项)。ORM 实体附加到不跨越请求的休眠会话(不要与 cf 会话混淆),一旦请求结束,您分配给会话的实体将分离。将 providerid 存储在会话中,并在每个请求中拉取实体。如果这看起来开销太大,只需存储基本请求所需的内容,例如 id 和 name,然后仅在您实际执行需要它的操作时加载实体。

  2. 您不应该修改类型为“id”的字段(除非您使用 provider="assigned")。

在休眠会话中,只能存在具有给定标识符的实体的一个实例,因此通过设置实体的 ID,然后尝试在同一 ID 上执行 entityLoadByPK(),您会混淆休眠。

如果你想有一个 get() 方法通过 id 检索特定实体,最好将它放在服务或工厂中。使用通用方法创建抽象服务很容易,用于获取或查找实体,然后您可以使用方法扩展以满足您的特定需求。Coldspring 2 包含一个 AbstractGateway,这是一个很好的起点 - http://sourceforge.net/apps/trac/coldspring/wiki/ORMAbstractGateway

TLDR;修复是要做的

session.provider = entityLoadByPK("Provider", loginResult.ProviderID);
于 2012-04-30T16:55:05.897 回答