На что следует обратить внимание в ColdFusion 9 с CF-ORM

StackOverflow https://stackoverflow.com/questions/2480377

  •  21-09-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

    Ошибка, связанная с этим ограничением, была зарегистрирована в базе ошибок Adobe.

  • ORMReload() с ormsettings.dbcreate = "drop create" возможно, не все таблицы будут удалены для вас. CF9 Кумулятивное Горячее исправление 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" если тебе нужно.

  • следует использовать inverse=true в двунаправленных отношениях, обычно в сторону "один ко многим".

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

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

  • 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 для эффективного сброса.

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

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

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

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

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

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

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

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

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

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

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

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

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

Обновить

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

Другие советы

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

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

В сочетании с настройкой ведения журнала в режиме гибернации вы также можете отключить "поддерживать соединения" для вашего источника данных.

Затем с помощью SQL Server 2005 вы можете запустить profiler и отслеживать поступающие запросы.

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

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

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

sp_execute 15, 'некоторый параметр'

Перед тем, как это было запущено, был запущен sp_prepexec, откуда и берется 15.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top