Lo + Leído
Eventos destacados
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:
- Introducción a Groovy, parte 1 (Andrés Almiray)
- Introducción a Groovy, parte 2 (Andrés Almiray)
- Introducción a Groovy, parte 3 (Andrés Almiray)
- Introducción a Grails (Material Seminario ImaginaWorks)
Los protagonistas te cuentan de qué van los proyectos más importantes del mundo 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/2009ahora 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/2009El 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/2009El 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)
}
Re: Relaciones 1 a 1 especificando en qué tabla va el campo relacionado
crgio - jueves 11/06/2009saludos 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,...