2010-04-06 17 views
6

¿Es posible crear una tabla que no tenga 'id'? Por ejemplo, este es mi dominio:¿Es posible que un dominio de Grails no tenga 'id'?

class SnbrActVector { 

    int nid 
    String term 
    double weight 

    static mapping = { 
     version false 
     id generator: 'identity' 
    } 

    static constraints = { 
    } 
} 

Cuando ejecuto esta sentencia SQL, se produce un error:

insert into snbr_act_vector values (5, 'term', 0.5) 

he comprobado la mesa y 'id' ya está establecido en AutoIncrement. Estoy pensando que otra opción es eliminar el 'id' en sí. ¿O hay otra solución para esto? Por favor, suponga que no es una opción cambiar la declaración SQL entregada.

Respuesta

1

Intente utilizar: "id (generator: 'assigned')" en lugar de "id generator: 'identity'" y vea si eso elimina la propiedad autoincrement de la columna de la base de datos "id".

+0

gracias por la respuesta. acaba de probar su sugerencia ahora y, por desgracia, la 'id' todavía está allí. – firnnauriel

+0

por cierto, eliminó la propiedad de autoincrement de 'id'. pero lo que necesito es eliminar totalmente la columna 'id' y tener solo 3 columnas: nid, term, weight – firnnauriel

4

Probablemente necesite especificar que nid es su columna de id.

static mapping = { 
    version false 
    id generator: 'identity', column: 'nid' 
} 
+0

parece que este podría ser otro enfoque. podría necesitar jugar con la propiedad 'generador'. tenga en cuenta una vez más que el objetivo principal es hacer que esta afirmación funcione sin modificaciones: insertar en snbr_act_vector values ​​(5, 'term', 0.5) – firnnauriel

+0

Si ese es realmente su objetivo, es posible que deba realizar una configuración adicional en tu DB. ¿Quizás un disparador para traducir la declaración a la definición de la tabla? De lo contrario, creo que la respuesta de Luke es casi lo máximo que puedes hacer con Grails/GORM. –

6

Gorm requiere un campo de identificación para funcionar. Puede falsificar una identificación asignada utilizando una variable transitoria como la siguiente. Los getters y setters asignan el campo nid al campo id.

Al guardar un objeto de dominio utilizando este método que tiene que hacer:

snbrActVectgor.save(insert:true) 

porque griales cree un identificador no nulo es una instancia persistente.

class SnbrActVector { 
    Integer id 
    // nid is the actual primary key 
    static transients = ['nid'] 
    void setNid(Integer nid) { 
     id = nid 
    } 
    Integer getNid() { 
     return nid 
    } 

    static mapping = { 
     version false 
     id generator:'assigned', column:'nid', type:'integer' 
    } 
} 
2

No hay forma de no tener "id". Lo que puede hacer es cambiar el nombre del campo "id" usando el generador de identificación asignado.

0

Sí en Oracle puede usar ROWID para la columna de ID.

class Document { 
    String id 

    static mapping = { 
     table "DOCUMENTS" 
     version false 
     id column: 'ROWID' 
    } 

} 
Cuestiones relacionadas