本文介绍了使用 CF-ORM 在 ColdFusion 9 中需要注意的事项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

解决方案

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

    有关此限制的错误已在 Adob​​e Bugbase 中提交.

  • ORMReload()ormsettings.dbcreate = "drop create" 可能不会为您删除所有表.CF9 Cumulative Hot Fix 1 稍微改善了这一点,但您可能想放弃自己在数据库中的表.

  • type="date"(默认使用ormtype="date"),只会存储日期而不存储时间.如果您还想保留时间,请使用 ormtype="timestamp"

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

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

  • 如果 fieldtype="id" 并且 generator 设置为某个 generator,ormtype 将默认为 int.

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

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

  • type="boolean" 默认使用tinyint,如果需要使用sqltype="bit".p>

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

  • NOT 在单向关系中使用 inverse="true"!这种关系可能根本就不会持久!

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

  • EntityLoad("entity", 1, true) 有效,但 EntityLoadByPK("entity", 1) 更简洁!

  • EntityLoad()EntityLoadByPK() 和带有 unique=trueORMExecuteQuery,将如果未找到实体,则返回 null.在使用返回值之前使用 isNull() 进行检查.

  • ORMExecuteQuery如果没有找到实体,默认返回空数组.

  • 不要忘记在一对多"/多对多"中使用 singularname 属性以获得更好看的生成函数(例如 addDog(Dogdog) vs addDogs(Dog dogs) .)

  • <cfdump> 将加载所有延迟加载属性.或者,您可以尝试 <cfdump var="#entityToQuery([entity])#"> 或设置 top=1 以高效转储.

  • 存储在 Session 范围内的实体将与其 Hibernate 会话范围断开连接,并且不会加载延迟加载属性.要恢复休眠会话范围,请使用 entityLoadByExample()entitySave(entity).

  • cascade="all-delete-orphan" 通常对一对多"或多对多"关系更有意义.Hibernate 设置 null 然后删除,因此请确保该列可以为空.测试并查看这是否是您的愿望行为.

  • notnull="true" 时设置 required="true",对于使用 CFCExplorer 浏览 CFC 的其他人来说更具可读性

  • EntityNew('Y')new com.XY 根据某些 Adob​​e 工程师的说法,如果稍后要持久化实体,则效率略高.

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

  • structKeyColumn不能是目标实体的PK.

  • 双向多对多不能使用struct

  • 向struct添加新实体时,structKeyColumn在CF持久化父实体时被忽略.

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

  • postInsert()处,实体休眠会话不再可用,因此在postInsert()处设置属性将被静默忽略,否则会抛出Session is Closed异常.

  • 实体被entityLoad()或HQL从DB加载后,即使没有调用EntitySave(),更改也会自动持久化.p>

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

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

更新

  • CF9.0.1+:使用,更容易做到cfqueryparam,调试输出实际显示绑定值.

What are some of the things you've observed in ColdFusion 9 with CF-ORM (Hibernate) that one should watch out for?

解决方案

  • entity init() method must not have required argument(s), otherwise EntityNew() and other CF-ORM actions will break. You may want to use a Factory to create the entity, and enforce the required arguments there.

    A bug regarding this limitation has been filed in the Adobe Bugbase.

  • ORMReload() with ormsettings.dbcreate = "drop create" might not drop all tables for you. CF9 Cumulative Hot Fix 1 improves this a little bit, but you might want to drop the tables in DB yourself.

  • type="date" (default to use ormtype="date"), will only store date but not time. If you want to persisted time as well, use ormtype="timestamp"

  • type="string" will default to varchar(255)

  • type="numeric" will default to float, not int. Use ormtype="int" if needed.

  • if fieldtype="id" and generator is set to some generator, ormtype will default to int.

  • type="string" length="10" will use varchar(10), not char(10)

  • ormtype="char" length="10" will use char(1) still. Use sqltype="char(10)" if you really need to.

  • type="boolean" use tinyint by default, use sqltype="bit" if you need to.

  • should use inverse=true in a bi-directional relationship, usually in "one-to-many" side.

  • do NOT use inverse="true" in uni-directional relationship! The relationship might not be persisted at all!

  • If you use MS-SQL, you cannot have more than 1 entity with one-to-one property set to Null, because Null is considered as an unique value in an index. Good idea to make column not null. (or use linktable)

  • EntityLoad("entity", 1, true) works, but EntityLoadByPK("entity", 1) is cleaner!

  • EntityLoad(), EntityLoadByPK(), and ORMExecuteQuery with unique=true, will return null if entity is not found. Use isNull() to check before you use the returned value.

  • ORMExecuteQuery will return empty array if no entity is found by default.

  • don't forget to use singularname property in "one-to-many" / "many-to-many" for nicer looking generated functions (e.g. addDog(Dog dog) vs addDogs(Dog dogs) .)

  • <cfdump> will load all the lazy-load properties. Alternatively you may try <cfdump var="#entityToQuery([entity])#"> or set top=1 to dump efficiently.

  • entity stored in Session scope will be disconnected with its Hibernate session scope, and lazy load property will not be loaded. To restore the hibernate session scope, use entityLoadByExample() or entitySave(entity).

  • cascade="all-delete-orphan" usually make more sense for "one-to-many" or "many-to-many" relationship. Hibernate sets null then delete, so make sure the column is nullable. Test and see if that's your desire behaviour.

  • set required="true" whenever notnull="true", more readable for others browsing the CFC with CFCExplorer

  • EntityNew('Y') is slightly more efficient than new com.X.Y if the entity is to be persisted later according to some Adobe engineer.

  • relationship with an inherited entity may break sometimes due to an unfixed Hibernate bug, use linktable as a workaround.

  • structKeyColumn cannot be the PK of the target entity.

  • bi-directional many-to-many cannot use struct

  • When adding new entity to struct, structKeyColumn is ignored when CF persists the parent entity.

  • If you access the one-to-many / many-to-many array or struct directly, make sure the corresponding array/struct exists before use. Generated addX()/hasX()/removeX() are safe to use anytime.

  • at postInsert(), the entity hibernate session is no longer available, so setting property at postInsert() will be silently ignore, or Session is Closed exception will be thrown.

  • after entity is loaded by entityLoad() or HQL from DB, the changes will be automatically persisted even if EntitySave() is not called.

  • transaction with CF-ORM is implemented in a way that it starts a new session and close when it's done.

  • inside the event (i.e. preLoad() / postInsert()), assigning to variables might throw Java exception about types. Use JavaCast() to work around the bug.

UPDATE

  • CF9.0.1+: use <cfquery dbtype="hql">, easier to do cfqueryparam, and debug output actually shows you the binded values.

这篇关于使用 CF-ORM 在 ColdFusion 9 中需要注意的事项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-22 10:00