2011-09-15 16 views
9

Recibo el error "ORA-00972: el identificador es demasiado largo" al guardar un objeto de clase de dominio.ORA-00972: el identificador es demasiado largo - La mejor estrategia para evitarlo en Grails

Caused by: org.hibernate.exception.SQLGrammarException: could not initialize a collection: [com.intelligrape.model.Address.studentsForPermanentAddressId#79366215] 

Cuáles podrían ser las posibles soluciones para resolver este problema, excepto la reducción de la longitud del campo studentsForPermanentAddressId. La razón es que esta es una tabla de base de datos heredada que no puedo modificar.

EDIT: Se agregó la descripción de la clase de dominio que se le preguntó por Rob Hruska

package com.intelligrape.model 

class Address { 

    String address1 
    String address2 
    String boxNumber 
    String city 
    Long stateLid 
    String province 
    String zipCode 
    Long countryLid 
    Double latitude 
    Double longitude 
    Long radius 

    static hasMany = [studentsForPermanentAddressId: Student, studentsForLocalAddressId: Student] 

static constraints = { 
     address1 nullable: true 
     address2 nullable: true 
     boxNumber nullable: true, size: 1..25 
     city nullable: true, size: 1..30 
     stateLid nullable: true 
     province nullable: true, size: 1..64 
     zipCode nullable: true, size: 1..15 
     countryLid nullable: true 
     latitude nullable: true 
     longitude nullable: true 
     radius nullable: true 
      studentsForPermanentAddressId nullable: true 
      studentsForLocalAddressId nullable: true 
    } 
} 
+0

Eso es interesante, el límite de longitud de Oracle es 30, y 'studentsForPermanentAddressId'" solo "tiene 29 caracteres. – NullUserException

+0

@NullUserException - No creo que 'studentsForPermanentAddressId' sea el nombre de la columna de la base de datos real; es probable que se esté asignando a algo como 'students_for_permanent _...'. –

+0

@Mohd: ¿Puedes proporcionar el código de clase de dominio que define la relación en cuestión? –

Respuesta

5

añadir un bloque de asignación y las asignaciones de columnas existentes:

package com.intelligrape.model 

class Address { 

    String address1 
    String address2 
    String boxNumber 
    String city 
    Long stateLid 
    String province 
    String zipCode 
    Long countryLid 
    Double latitude 
    Double longitude 
    Long radius 

    static hasMany = [studentsForPermanentAddressId: Student, studentsForLocalAddressId: Student] 
    static mappings = { 
     studentsForPermanentAddressId(column: 'stud_perm_addr_id') 
    } 
    static constraints = { 
     address1 nullable: true 
     address2 nullable: true 
     boxNumber nullable: true, size: 1..25 
     city nullable: true, size: 1..30 
     stateLid nullable: true 
     province nullable: true, size: 1..64 
     zipCode nullable: true, size: 1..15 
     countryLid nullable: true 
     latitude nullable: true 
     longitude nullable: true 
     radius nullable: true 
      studentsForPermanentAddressId nullable: true 
      studentsForLocalAddressId nullable: true 
    } 
} 

Como acotación al margen, si esto no fuera una base de datos heredada puede usar este proyecto: http://code.google.com/p/hibernate-naming-strategy-for-oracle/

Para generar asignaciones correctas desde el principio.

Cuestiones relacionadas