На что обращать внимание в ColdFusion 9 с CF-ORM - PullRequest
27 голосов
/ 19 марта 2010

На что вы должны обратить внимание в ColdFusion 9 с CF-ORM (Hibernate)?

Ответы [ 4 ]

49 голосов
/ 19 марта 2010
  • entity init() не должно быть обязательных аргументов, иначе EntityNew() и другие действия CF-ORM прервутся. Возможно, вы захотите использовать Фабрику для создания сущности и применения там необходимых аргументов.

    Ошибка в отношении этого ограничения была зарегистрирована в Adobe 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" и генератор установлен на некоторый генератор, 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 в двунаправленных отношениях, обычно со стороны «один ко многим».

  • do NOT используйте inverse="true" в однонаправленных отношениях! Отношения могут вообще не сохраняться!

  • Если вы используете MS-SQL, у вас не может быть более 1 сущности с однозначным свойством, равным Null, поскольку Null рассматривается как уникальное значение в индексе. Хорошая идея сделать столбец не нулевым. (или используйте linktable)

  • EntityLoad("entity", 1, true) работает, но EntityLoadByPK("entity", 1) чище!

  • EntityLoad(), EntityLoadByPK() и ORMExecuteQuery с unique=true вернет null, если объект не найден. Используйте isNull() для проверки перед использованием возвращаемого значения.

  • ORMExecuteQuery вернет пустой массив, если сущность не найдена по умолчанию.

  • не забудьте использовать свойство singularname в «один-ко-многим» / «многие-ко-многим» для более приятных на вид генерируемых функций (например, addDog(Dog dog) против addDogs(Dog dogs).)

  • <cfdump> загрузит все свойства отложенной загрузки. В качестве альтернативы вы можете попробовать <cfdump var="#entityToQuery([entity])#"> или установить top = 1 для эффективного сброса.

  • сущность, сохраненная в области действия сеанса, будет отключена с областью действия сеанса Hibernate, а свойство отложенной загрузки не будет загружено. Чтобы восстановить область сеанса гибернации, используйте entityLoadByExample() или entitySave(entity).

  • cascade="all-delete-orphan" обычно имеет больше смысла для отношений «один ко многим» или «многие ко многим». Hibernate устанавливает ноль, а затем удаляет, поэтому убедитесь, что столбец обнуляем. Проверьте и убедитесь, что это ваше желание поведения.

  • устанавливается required="true" всякий раз, когда notnull="true", более читабельно для других, просматривающих CFC с помощью CFCExplorer

  • EntityNew('Y') немного более эффективен, чем new com.X.Y, если сущность должна быть сохранена позже, согласно некоторому инженеру Adobe.

  • отношения с унаследованной сущностью могут иногда нарушаться из-за нефиксированной ошибки Hibernate, используйте linktable в качестве обходного пути.

  • structKeyColumn не может быть PK целевого объекта.

  • двунаправленный «многие ко многим» не может использовать struct

  • При добавлении нового объекта в структуру, structKeyColumn игнорируется, если CF сохраняет родительский объект.

  • Если вы обращаетесь к массиву или структуре «один ко многим / многие ко многим» напрямую, убедитесь, что соответствующий массив / структура существует перед использованием. Созданные addX () / hasX () / removeX () безопасны для использования в любое время.

  • в postInsert(), сеанс спящего объекта больше не доступен, поэтому установка свойства в postInsert () будет игнорироваться без предупреждения или будет выдано исключение Session is Closed.

  • после загрузки сущности с помощью entityLoad() или HQL из БД, изменения будут автоматически сохраняться, даже если EntitySave() не вызывается.

  • транзакция с CF-ORM реализована таким образом, что она запускает новый сеанс и закрывается по завершении.

  • внутри события (то есть preLoad () / postInsert()), присваивание переменным может вызвать исключение Java для типов.Используйте JavaCast (), чтобы обойти ошибку.

ОБНОВЛЕНИЕ

  • CF9.0.1 +: используйте <cfquery dbtype="hql">, прощесделайте cfqueryparam, и вывод отладки фактически покажет вам связанные значения.
7 голосов
/ 09 августа 2010

Добавить рекомендации:

  • Отключить ormsettings.flushAtRequestEnd = false, чтобы в конце запроса не было автоматической очистки.Вместо этого используйте транзакции (начиная с CF9.01, cftransaction сбрасывает сессию для завершения транзакции) вокруг всех транзакций записи (entitySave () или при редактировании персистентной сущности).
  • Предотвращение внедрения SQL с использованием связанных параметров в HQL- без имени '?'или именованные нотации ':', чтобы обеспечить привязку типов ORM к рассматриваемому полю (как это делает CFQUERYPARAM).Предотвращение SQL-инъекций!
  • CF9.0.1 позволяет CFQUERY dbtype = "hql" записывать и выводить HQL inline.Используйте CFQUERYPARAM для связывания встроенных параметров (эквивалентно неназванной нотации? В HQL).
  • Используйте LEFT OUTER JOIN FETCH в HQL для активизации отношений выборки.
  • Переопределение добавления / удаления функций в CFC с помощьюНаправленные отношения, чтобы гарантировать, что обе стороны установлены, когда любой из них.
  • Включите ormsettings.logsql = true для просмотра производного SQL в консоли.Настройте параметры log4j Hibernate для дальнейшей настройки параметров журнала из Hibernate.
  • Присоединитесь к группе Google cf-orm-dev.Светлые люди там.
2 голосов
/ 29 октября 2010

В сочетании с манипулированием журналированием Hibernate вы также можете отключить функцию «поддерживать соединения» для своего источника данных.

С SQL Server 2005 вы можете запустить профилировщик и наблюдать за поступающими запросами.

Поскольку поддержка соединений отключена, Hibernate будет вынужден каждый раз создавать новые подготовленные операторы.

Чтение подготовленных операторов может быть сложным, но по крайней мере вы можете видеть необработанные запросы, которые генерируются.

Если вы поддерживаете соединения, эти подготовленные операторы создаются один раз, и вы просто видите что-то вроде

sp_execute 15, 'someparam'

До этого запускался sp_prepexec, откуда и происходит 15.

1 голос
/ 30 апреля 2010

EntityReload игнорирует отложенную загрузку, как CFDUMP.

Я использую его после EntitySave для захвата любых дефолтных столбцов в БД. Я вижу в SQL Profiler (инструмент трассировки для SQL Server) множество запросов, поступающих через.

Если изменить его на EntityLoadByPK и т. Д., Он загрузит объект и не увидит все лишние запросы отношений, которые для меня могут вызвать серьезные проблемы.

...