Что такое некоторые вещи, которые Вы наблюдали в ColdFusion 9 с CF-ORM (В спящем режиме), который нужно не упустить?
Метод 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 (), чтобы обойти ошибку.
ОБНОВЛЕНИЕ
, проще сделать cfqueryparam
, и вывод отладки фактически показывает вам связанные значения. EntityReload, похоже, игнорирует ленивую загрузку, как CFDUMP.
Я использую его после EntitySave, чтобы захватить все дефолтные колонки в базе данных. Я вижу в SQL Profiler (инструмент трассировки для SQL Server) множество запросов, проходящих через него.
Если изменить его на EntityLoadByPK и т.д., он загрузит объект и не увидит всех избыточных запросов отношений, которые для меня могут вызвать большие проблемы.
Дополнительные рекомендации: