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

Hen*_*nry 27 coldfusion orm coldfusion-9

您在使用CF-ORM(Hibernate)的ColdFusion 9中观察到的一些内容应该注意什么?

Hen*_*nry 50

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

    有关此限制的错误已在Adobe Bugbase中提交.

  • ORMReload()ormsettings.dbcreate = "drop create"可能不会删除所有的表你. CF9累积热修复1稍微改进了一点,但您可能希望自己删除DB中的表.

  • type="date"(默认使用ormtype="date"),只会存储日期而不是时间.如果你想要坚持时间,请使用ormtype="timestamp"

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

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

  • if fieldtype="id"和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",如果你需要.

  • 应该使用inverse=true双向关系,通常是"一对多"方面.

  • 千万不要inverse="true"在单向关系!这种关系可能根本就没有了!

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

  • EntityLoad("entity", 1, true)工作,但EntityLoadByPK("entity", 1)更清洁!

  • EntityLoad(),EntityLoadByPK()ORMExecuteQuerywith unique=true,null如果找不到实体,将返回.用于isNull()在使用返回值之前进行检查.

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

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

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

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

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

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

  • EntityNew('Y')new com.X.Y根据一些Adobe工程师的说法,稍微提高实体的效率会稍微提高一些效率.

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

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

  • 双向多对多不能使用struct

  • 向struct添加新实体structKeyColumn时,CF会持久保存父实体时被忽略.

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

  • at postInsert(),实体hibernate会话不再可用,因此postInsert()的设置属性将被静默忽略,或者Session is Closed异常将被抛出.

  • 在实体加载entityLoad()或来自DB的HQL之后,即使EntitySave()未调用,更改也将自动保留.

  • CF-ORM事务的实现方式是它启动一个新的会话,并在它完成时关闭.

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

UPDATE

  • CF9.0.1 +:使用<cfquery dbtype="hql">,更容易做cfqueryparam,调试输出实际上显示了绑定值.

  • 我也喜欢EntityLoadByPk,但我不会说它更好.它更适合通过PK加载单个实例.我还补充一点,你不应该(通常)存储一个实体是一个持久的范围.可能会诱惑人们,例如将用户实体存储在会话范围中.虽然实体与Hibernate分离,但这可能会导致问题. (4认同)

muj*_*imu 7

添加建议:

  • 关闭ormsettings.flushAtRequestEnd = false以在请求结束时不自动刷新.而是在所有写入事务(entitySave()或编辑持久化实体时)使用事务(从CF9.01开始,cftransaction为您的事务完成刷新会话).
  • 通过在HQL中使用绑定参数来防止SQL注入 - 未命名的'?' 或命名为':'的符号,以确保ORM对相关字段的类型绑定(如CFQUERYPARAM一样).防止SQL注入!
  • CF9.0.1允许CFQUERY dbtype ="hql"编写和输出内联的HQL.使用CFQUERYPARAM绑定内联params(相当于HQL中的未命名?表示法).
  • 在HQL中使用LEFT OUTER JOIN FETCH以获得急切的获取关系.
  • 使用双向关系覆盖CFC上的添加/删除功能,以确保在任何一方都设置双方.
  • 转动ormsettings.logsql = true以在控制台中查看派生SQL.调整log4j休眠设置以进一步调整Hibernate的日志设置.
  • 加入Google Group cf-orm-dev.那里有光明的人.