2010-12-09 51 views
4

J'ai rencontré un problème en essayant de créer une application Grails avec une base de données AS400/DB2. Je ne peux pas obtenir la plupart des fichiers mappés car ils n'ont pas de champ unique à utiliser comme ID. Et même s'ils le font, ils sont un champ basé sur le texte et non dans un format qui pourrait être converti en un type long. (Je ne comprends pas pourquoi le PK doit être un type de données long? Si vous voulez une séquence ou une IA pour le pk qui aurait du sens, mais si vous aviez juste besoin d'une clé unique, est-ce qu'il me manque quelque chose?) Je me demande s'il est possible de conserver la source de données que j'ai configurée et de l'utiliser pour un accès SQL direct à la base de données sans avoir à utiliser les objets de domaine?Accès à la base de données sans les classes de domaine avec Grails

Quelque chose que j'ai vu était en train de définir l'objet de domaine comme transitoire. Mais je ne sais pas si vous pouvez toujours faire quelque chose comme ça sans un champ d'identification. Quelqu'un sait comment cela fonctionne?

Des idées?

Merci, Jon

Répondre

3

Vous pouvez accéder à la base de données assez facilement, nous faisons la même chose dans certains cas pour des raisons de performance:

class SomeService { 
    def dataSource; 

    def nativeAccessMethod = { 
     def sql = new Sql(dataSource); 
     def rows = sql.rows("select * from myTable"); 
     /* processing continues ...*/ 
    } 
} 

Groovy de native SQL support est aussi agréable.

+0

Cela a fonctionné pour la plupart. La source de données revenait null donc j'ai dû utiliser def dataSource = AH.application.mainContext.dataSource pour obtenir l'objet dataSource. – jonsinfinity

+0

Et quelle est l'importation pour la classe Sql? – user2427

+0

L'importation est groovy.sql.Sql –

3

Il n'y a pas besoin qu'une clé primaire soit longue, il est juste la norme pour Hibernate et Grails. Vous pouvez traiter une colonne varchar est unique comme la clé primaire avec une classe de domaine comme celui-ci:

class Person { 

    String username 
    String firstName 
    String lastName 

    static mapping = { 
     id name: 'username', generator: 'assigned' 
     version false 
    } 
} 

Cela fonctionne pour une table définie par cette LDD:

create table person (
    username varchar(255) not null, 
    first_name varchar(255) not null, 
    last_name varchar(255) not null, 
    primary key (username) 
); 

J'ai ajouté « fausse version » depuis C'est un système hérité et vous n'avez probablement pas de colonne de verrouillage optimiste 'version'.