ColdFusion ORM создает неверный тип данных
База данных: MySql 5.1.47 на OS X
Настройки ORM в Application.cfc:
this.ormEnabled = true; this.ormsettings = {autogenmap = true, dbCreate = application.dbCreate, automanageSession = true, источник данных = application.dsn, logSQL = application.logSQL, sqlScript = application.sqlScript};
News.cfc
/**
* These are the news items
* @persistent true
* @accessors true
* @output false
* @entityname "News"
* @table news
*/
component
{
property name="NewsId" type="string" fieldtype="id" ormtype="integer" generator="native" generated="insert";
property name="Teaser" type="string" sqltype="varchar(200)";
property name="Story" type="string" sqltype="varchar(500)";
property name="ProductLineId" type="numeric" sqltype="int" ormtype="int" fieldtype="many-to-one" cfc="ProductLine" fkcolumn="ProductLineId" foreignkeyname="fk_productline_news";
}
ProductLine.cfc
/**
* @persistent true
* @accessors true
* @output false
* @table productline
*/
component
{
property name="ProductLineId" sqltype="int" fieldtype="id" ;
property name="Label" type="string" sqltype="varchar(50)";
}
Отладка вывода из ORMReload()
[localhost]:10/05 21:32:00 [jrpp-70] HIBERNATE DEBUG -
[localhost]: create table news (
[localhost]: NewsId integer not null auto_increment,
[localhost]: Teaser varchar(200),
[localhost]: Story varchar(500),
[localhost]: **ProductLineId varchar(255)**,
[localhost]: primary key (NewsId)
[localhost]: )
[localhost]:10/05 21:32:00 [jrpp-70] HIBERNATE DEBUG -
[localhost]: create table productline (
[localhost]: ProductLineId int not null,
[localhost]: Label varchar(50),
[localhost]: primary key (ProductLineId)
[localhost]: )
[localhost]:10/05 21:32:01 [jrpp-70] HIBERNATE DEBUG -
[localhost]: alter table news
[localhost]: add index fk_productline_news (ProductLineId),
[localhost]: add constraint fk_productline_news
[localhost]: foreign key (ProductLineId)
[localhost]: references productline (ProductLineId)
Создание базы данных завершается неудачно, когда он пытается создать отношение внешнего ключа. Обратите внимание, что поле в новостях является varchar(255). Откуда это пришло? Я пытался установить его как целое число в каждом месте, которое смог найти, но оно всегда генерируется как varchar. Я думаю, именно поэтому отношения терпят неудачу, так как два поля имеют разные типы данных.
Что я делаю неправильно?
3 ответа
Вот шаги, которые я предпринял, чтобы наконец заставить это работать правильно.
Будьте осторожны с таблицей имен с ColdFusion/MySql/OS X. Это может действительно убить orm. Случается так, что если при настройке MySql используется неправильная обработка регистра, Orm удалит таблицу, но затем не сможет воссоздать ее, потому что MySql все еще думает, что таблица существует, но с другим регистром. Это может быть особенно неприятно, так как инструменты MySql не будут отображать таблицу с неправильным регистром, но вы все равно можете запросить ее. Это известная проблема с командой MySql. Мой совет заключается в том, чтобы просто указать все строчные имена для ваших таблиц и установить для параметра конфигурации регистра MySql значение 1 (хранить в нижнем регистре, без учета регистра). Казалось, это работает для меня.
Убедитесь, что вы установили параметр диалекта orm на "MySQLwithInnoDb"
Установите ormtype на все ключи.
Придерживайтесь int или integer и используйте его последовательно. Я пошел с целым числом.
Изредка перезагружать все / перезагружать.
Я взял sqltype из ссылки на внешний ключ в News.cfc
После того, как я все это сделал, он наконец начал работать, как и ожидалось.
Вот мой последний News.cfc
/**
* Theser are the news items on the home page.
* @persistent true
* @accessors true
* @output false
* @entityname "News"
* @table news
*/
component
{
property name="NewsId" type="string" fieldtype="id" ormtype="integer" generator="native" generated="insert";
property name="Teaser" type="string" sqltype="varchar(200)";
property name="Story" type="string" sqltype="varchar(500)";
property name="ProductLine" fieldtype="many-to-one" cfc="ProductLine" ormtype="integer" fkcolumn="ProductLineId" foreignkeyname="fk_productline_news";
}
Попробуйте это в News.cfc вместо этого:
имя свойства ="productLine" fieldtype="много-к-одному" cfc="ProductLine" fkcolumn="ProductLineID" foreignkeyname="fk_productline_news"
Вам не нужен ormtype для вашего свойства ProductLineID в ProductLine.cfc? И я заметил, что у вас есть "ormtype=int" в одном месте, и ormtype = целое число в другом.