在使用CF-ORM的ColdFusion 9中需要注意的事项
您在使用CF-ORM(Hibernate)的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”)将只存储日期而不存
- 实体
方法不能有必需的参数,否则init()
和其他CF-ORM操作将中断。您可能希望使用工厂来创建实体,并在那里强制执行必需的参数EntityNew()
- 带有
的或msettings.dbcreate=“drop create”
可能不会为您删除所有表。这有一点改进,但是您可能希望自己删除数据库中的表ORMReload()
(默认使用type=“date”
)将只存储日期而不存储时间。如果您还想保留时间,请使用或mtype=“date”
或mtype=“timestamp”
将默认为type=“string”
varchar(255)
将默认为type=“numeric”
,而不是float
。如果需要,请使用ormtype=“int”int
- 如果
且生成器设置为某个生成器,则ormtype将默认为fieldtype=“id”
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
vsaddDog(Dog Dog)
)addDogs(Dog Dog)
将加载所有延迟加载属性。或者,您可以尝试
或将top=1设置为高效转储- 存储在会话作用域中的实体将与其Hibernate会话作用域断开连接,并且不会加载lazy load属性。要还原hibernate会话作用域,请使用
或entityLoadByExample()
entitySave(entity)
通常对“一对多”或“多对多”关系更有意义。Hibernate设置null,然后删除,因此确保该列可为null。测试并看看这是否是你的欲望行为cascade=“all delete orphan”
- 设置
,无论何时required=“true”
,对于使用CFC浏览器浏览CFC的其他人来说更具可读性notnull=“true”
- 根据一些Adobe工程师的说法,
比EntityNew('Y')
稍微高效一些,前提是实体要在以后持久化new com.X.Y
- 与继承实体的关系有时可能由于未修复的Hibernate错误而中断,请使用
作为解决方法linktable
不能是目标实体的主键structKeyColumn
- 双向多对多不能使用struct
- 将新实体添加到结构时,当CF持久化父实体时,
将被忽略structKeyColumn
- 如果直接访问一对多/多对多数组或结构,请确保在使用前存在相应的数组/结构。生成的addX()/hasX()/removeX()可以随时安全使用
- 在
处,实体休眠会话不再可用,因此postInsert()处的设置属性将被静默忽略,或者将引发会话关闭异常postInsert()
- 通过数据库中的
或HQL加载实体后,即使未调用entityLoad()
,更改也将自动保留EntitySave()
- 使用CF-ORM的事务以一种方式实现,即启动一个新会话,并在完成后关闭
- 在事件内部(即preLoad()/postInsert()),分配给变量可能会引发关于类型的Java异常。使用JavaCast()解决该bug
- CF9.0.1+:使用
,更容易操作
,调试输出实际上会显示绑定的值cfqueryparam
- 关闭ormsettings.flushAtRequestEnd=false以在请求结束时不进行自动刷新。相反,在所有写事务(entitySave()或编辑持久化实体时)周围使用事务(从CF9.01开始,cftransaction刷新事务完成的会话)
- 防止usin注入SQL