Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Grails

Relaciones 1 a 1 especificando en qué tabla va el campo relacionado

Juan Olalla - jueves 11/06/2009

 

Tengo una relación uno a uno entre dos entidades Persona y Dni. No todas las personas tienen un Dni por lo que quiero que la clave se forme a través de un campo en la tabla dni apuntando a la persona a la que pertenece. En la clase Dni pongo un "static belongsTo = [persona:Persona]" y me funciona, pero si quiero poner una propiedad dni (nullable) en la clase Persona me crea un campo en la tabla persona que no deseo.

¿Hay alguna forma de decirle que no mapee como columna un campo concreto en la base de datos? ¿Cómo se resolvería este problema de manera sencilla (sin mapear todas las columnas)?

Re: Relaciones 1 a 1 especificando en qué tabla va el campo relacionado

crgio - jueves 11/06/2009

saludos juan...

si luego de haber estudiado tu caso concluiste que la relación entre persona y dni es 1 a 1 no tienes porque poner ninguna referencia en la persona, ya que estas relaciones lo que hacen es llevar la llave primaria de una entidad a la otra, entonces con que  tengas lo siguiente es suficiente.

class Persona {

   String nombre

    String apellido

    static constraints = {

    }

 

class Dni {

    String dni

    Persona persona

    static constraints = {

        dni(nullable:false)

        persona(nullable:true)

    }

 

de esta manera te mapea la relación 1:1,... 

Re: Relaciones 1 a 1 especificando en qué tabla va el campo relacionado

crgio - jueves 11/06/2009

ahora si no quieres que un atributo se mapee en la bd lo declaras transient y listo:

class persona{

  static transients=["dni"]

String nombre

String apellido

 Dni dni

Re: Relaciones 1 a 1 especificando en qué tabla va el campo relacionado

Juan Olalla - viernes 12/06/2009

El problema es que usando transients, no lo mapea pero tampoco lo enlaza con la relación existente entre ámbas tablas. Lo que yo quiero es definir la relación del lado del Dni, ya que todo Dni pertenece a una persona, pero no siempre que tengo la persona conozco su DNI y por tanto existe un registro asociado.

Como digo con transients solo no funciona, habría que hacer algo así:

    Dni dni
    static transients = ["dni"]
    Dni getDni() {
        def dniAsociado = Dni.findByPersona(this)
        if (dniAsociado != null) {
            return dniAsociado
        }
        else
            return null
    }

 

Y análogamente se podría definir un setter. Al final tendríamos lo que pretendía, un campo dni (que puede ser null) en la tabla persona, que utiliza la relación pero que no se transforma en un campo de la tabla persona. Lo único es que yo preguntaba por una forma menos artesanal de hacerlo, si existe :P

 

Re: Relaciones 1 a 1 especificando en qué tabla va el campo relacionado

Juan Olalla - viernes 12/06/2009

El código original tiene más cosas que le he quitado, y releyendo veo que el ejemplo se quedaría en:

Dni getDni() {

  return Dni.findByPersona(this)

}

 

 

Responder al hilo | Volver al foro "Grails" | Volver a los foros