在使用CF-ORM的ColdFusion 9中需要注意的事项

在使用CF-ORM的ColdFusion 9中需要注意的事项,orm,coldfusion,coldfusion-9,Orm,Coldfusion,Coldfusion 9,您在使用CF-ORM(Hibernate)的ColdFusion 9中观察到了哪些值得注意的事情? 实体init()方法不能有必需的参数,否则EntityNew()和其他CF-ORM操作将中断。您可能希望使用工厂来创建实体,并在那里强制执行必需的参数 带有或msettings.dbcreate=“drop create”的ORMReload()可能不会为您删除所有表。这有一点改进,但是您可能希望自己删除数据库中的表 type=“date”(默认使用或mtype=“date”)将只存储日期而不存

您在使用CF-ORM(Hibernate)的ColdFusion 9中观察到了哪些值得注意的事情?

  • 实体
    init()
    方法不能有必需的参数,否则
    EntityNew()
    和其他CF-ORM操作将中断。您可能希望使用工厂来创建实体,并在那里强制执行必需的参数

  • 带有
    或msettings.dbcreate=“drop create”
    ORMReload()
    可能不会为您删除所有表。这有一点改进,但是您可能希望自己删除数据库中的表

  • type=“date”
    (默认使用
    或mtype=“date”
    )将只存储日期而不存储时间。如果您还想保留时间,请使用
    或mtype=“timestamp”

  • type=“string”
    将默认为
    varchar(255)

  • type=“numeric”
    将默认为
    float
    ,而不是
    int
    。如果需要,请使用ormtype=“int”

  • 如果
    fieldtype=“id”
    且生成器设置为某个生成器,则ormtype将默认为
    int

  • type=“string”length=“10”
    将使用
    varchar(10)
    ,而不是
    char(10)

  • ormtype=“char”length=“10”
    仍将使用
    char(1)
    。如果确实需要,请使用
    sqltype=“char(10)”

  • type=“boolean”
    使用
    tinyint
    默认情况下,如果需要,请使用
    sqltype=“bit”

  • 应在双向关系中使用
    inverse=true
    ,通常在“一对多”端

  • 不要在单向关系中使用
    inverse=“true”
    !这种关系可能根本不会持久化

  • 如果使用MS-SQL,则一对一属性设置为Null的实体不能超过1个,因为Null被视为索引中的唯一值。使列不为null是个好主意。(或使用链接表)

  • EntityLoad(“entity”,1,true)
    有效,但
    EntityLoadByPK(“entity”,1)
    更干净

  • EntityLoad()
    EntityLoadByPK()
    ,以及
    orExecuteQuery
    带有
    unique=true
    ,如果找不到实体,将返回
    null
    。使用返回值之前,请使用
    isNull()
    进行检查

  • 如果默认情况下找不到实体,
    ORMExecuteQuery
    将返回空数组

  • 不要忘记在“一对多”/“多对多”中使用
    singularname
    属性以获得更美观的生成函数(例如
    addDog(Dog Dog)
    vs
    addDogs(Dog Dog)

  • 将加载所有延迟加载属性。或者,您可以尝试
    或将top=1设置为高效转储

  • 存储在会话作用域中的实体将与其Hibernate会话作用域断开连接,并且不会加载lazy load属性。要还原hibernate会话作用域,请使用
    entityLoadByExample()
    entitySave(entity)

  • cascade=“all delete orphan”
    通常对“一对多”或“多对多”关系更有意义。Hibernate设置null,然后删除,因此确保该列可为null。测试并看看这是否是你的欲望行为

  • 设置
    required=“true”
    ,无论何时
    notnull=“true”
    ,对于使用CFC浏览器浏览CFC的其他人来说更具可读性

  • 根据一些Adobe工程师的说法,
    EntityNew('Y')
    new com.X.Y
    稍微高效一些,前提是实体要在以后持久化

  • 与继承实体的关系有时可能由于未修复的Hibernate错误而中断,请使用
    linktable
    作为解决方法

  • structKeyColumn
    不能是目标实体的主键

  • 双向多对多不能使用struct

  • 将新实体添加到结构时,当CF持久化父实体时,
    structKeyColumn
    将被忽略

  • 如果直接访问一对多/多对多数组或结构,请确保在使用前存在相应的数组/结构。生成的addX()/hasX()/removeX()可以随时安全使用

  • postInsert()
    处,实体休眠会话不再可用,因此postInsert()处的设置属性将被静默忽略,或者将引发会话关闭异常

  • 通过数据库中的
    entityLoad()
    或HQL加载实体后,即使未调用
    EntitySave()
    ,更改也将自动保留

  • 使用CF-ORM的事务以一种方式实现,即启动一个新会话,并在完成后关闭

  • 在事件内部(即preLoad()/postInsert()),分配给变量可能会引发关于类型的Java异常。使用JavaCast()解决该bug

更新

  • CF9.0.1+:使用
    ,更容易操作
    cfqueryparam
    ,调试输出实际上会显示绑定的值

EntityReload似乎忽略了CFDUMP之类的延迟加载

我在EntitySave之后使用它来获取数据库中的任何默认列。我在SQL Profiler(SQL Server的跟踪工具)中看到了大量的查询

如果将其更改为EntityLoadByPK等,它将加载对象,并且不会看到所有多余的关系查询,这对我来说可能会导致重大问题。

添加建议:

  • 关闭ormsettings.flushAtRequestEnd=false以在请求结束时不进行自动刷新。相反,在所有写事务(entitySave()或编辑持久化实体时)周围使用事务(从CF9.01开始,cftransaction刷新事务完成的会话)
  • 防止usin注入SQL