Вещи не упустить в ColdFusion 9 с CF-ORM

Что такое некоторые вещи, которые Вы наблюдали в ColdFusion 9 с CF-ORM (В спящем режиме), который нужно не упустить?

27
задан 4 revs, 4 users 100% 24 September 2013 в 12:42
поделиться

3 ответа

  • Метод entity init () не должен иметь обязательных аргументов, иначе EntityNew () и другие Действия CF-ORM будут нарушены. Возможно, вы захотите использовать Factory для создания объекта и принудительного применения требуемых аргументов.

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

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

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

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

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

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

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

  • загрузит все свойства отложенной загрузки. В качестве альтернативы вы можете попробовать или установить top = 1 для эффективного дампа.

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

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

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

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

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

  • structKeyColumn не может быть PK целевой сущности.

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ

  • CF9.0.1 +: используйте , проще сделать cfqueryparam , и вывод отладки фактически показывает вам связанные значения.
50
ответ дан 28 November 2019 в 04:48
поделиться

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

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

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

1
ответ дан 28 November 2019 в 04:48
поделиться

Дополнительные рекомендации:

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

Похожие вопросы: