2010-10-06 9 views
0

Base de données: MySql 1.5.47 sur OS XColdFusion ORM crée un mauvais type de données

ORM Paramètres dans Application.cfc:

this.ormEnabled = true; this.ormsettings = { autogenmap = true, DBCreate = application.dbCreate, automanageSession = true, = application.dsn source de données, 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)"; 
} 

sortie de débogage de 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) 

La création db échoue lorsqu'il tente de créer la relation clé étrangère . Notez que le champ dans les nouvelles est un varchar (255). D'où vient cela? J'ai essayé de le définir comme un entier dans chaque endroit que je pourrais trouver mais il est toujours généré comme un varchar. Je pense que c'est pourquoi la relation échoue puisque les deux champs sont des types de données différents.

Qu'est-ce que je fais mal?

Répondre

0

Voici les étapes que j'ai suivies pour que cela fonctionne correctement.

  1. Méfiez-vous des cas tablename avec ColdFusion/MySql/OS X. Il peut vraiment tuer ORM. Ce qui se passe est que si le mauvais traitement de cas est utilisé dans la configuration MySql, ORM tomber une table mais être incapable de recréer parce que MySql encore pense que la table existe, mais avec un cas différent. Cela peut être particulièrement frustrant car les outils MySql ne vont pas réellement afficher le tableau avec le mauvais cas , mais vous pouvez toujours l'interroger. Ceci est un problème connu avec l'équipe MySql . Mon conseil est simplement de fournir tous les noms minuscules pour vos tables et de définir votre option de configuration MySQL table case à 1 (stocker en minuscule, insensible à la casse). Ce a semblé fonctionner pour moi.

  2. Assurez-vous de définir votre option dialecte ORM à "MySQLwithInnoDb"

  3. Set ormtype sur toutes les touches.

  4. Stick avec int ou entier et l'utiliser de manière cohérente. Je suis allé avec entier.

  5. De temps en temps tout redémarrer/redémarrer.

  6. Je pris sqltype hors de la référence clé étrangère dans News.cfc

Après avoir fait tout cela, il a finalement commencé à travailler comme prévu.

Voici ma dernière 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"; 

} 
1

essayer à la place News.cfc:

property name = "ProductLine" FieldType = "many-to-one" cfc = "ProductLine" fkcolumn = "ProductLineID" foreignkeyname = "fk_productline_news"

+0

tout cela fonctionne et permet l'exportation de cform pour terminer, la relation ne semble pas exister dans MySQL. ProductLineId est toujours créé en tant que varchar (255). Il semble que cela devrait être int – anopres

0

Vous n'avez pas besoin d'un ormtype sur votre propriété ProductLineID dans ProductLine.cfc? Et j'ai remarqué que vous avez "ormtype = int" dans un endroit, et ormtype = entier dans un autre.

+0

Ajout de l'ormtype = "int" à l'ID ProductLine semble correctif le type de données de la table News, mais la relation n'est toujours pas créée autant que je peux dire. int vs integer ne devrait faire aucune différence car ils sont synonymes dans MySQL pour la même chose, mais je vais standardiser un. – anopres

+0

une chose que j'ai remarqué est que vous avez un "type = numérique" sur votre ProductLineID dans le composant Nouvelles. Vous devriez probablement enlever ça. Je doute que cela affecte la façon dont Hibernate crée les tables, cependant. –