5.2.1.1 Varios-a-uno y uno-a-uno - Reference Documentation
Authors: Graeme Rocher, Peter Ledbrook, Marc Palmer, Jeff Brown, Luke Daley, Burt Beckwith
Version: null
5.2.1.1 Varios-a-uno y uno-a-uno
A many-to-one relationship is the simplest kind, and is defined with a property of the type of another domain class. Consider this example:
Una relación de varios-a-uno es el tipo más simple, se define mediante una propiedad del tipo de otra clase de dominio. Considere este ejemplo:Example A
Ejemplo A
class Face {
Nose nose
}class Nose {
}
In this case we have a unidirectional many-to-one relationship from
En este caso tenemos una relación unidireccional varios-a-uno desde Face to Nose. To make this relationship bidirectional define the other side as follows:
Face hacia Nose. Para hacer esta relación bidireccional, es necesario definir el otro lado de la siguiente manera:Example B
Ejemplo B
class Face {
Nose nose
}class Nose {
static belongsTo = [face:Face]
}
In this case we use the
En este caso establecemos mediante belongsTo setting to say that Nose "belongs to" Face. The result of this is that we can create a Face, attach a Nose instance to it and when we save or delete the Face instance, GORM will save or delete the Nose. In other words, saves and deletes will cascade from Face to the associated Nose:
belongsTo que Nose pertenece a Face. Como resultado de esto podemos crear Face, agregar una instancia de Nose y cuando guardemos o eliminemos la instancia de Face, GORM guardara o eliminara Nose. En otras palabras, la actualización y eliminación se realizaran en cascada desde Face hacia Nose.new Face(nose:new Nose()).save()
The example above will save both face and nose. Note that the inverse is not true and will result in an error due to a transient
En el ejemplo anterior ambos, face y nose serán guardados. Esto no funcionara de modo inverso y el resultado seria un error debido a un Face:
Face que es transitorio.new Nose(face:new Face()).save() // will cause an error
new Nose(face:new Face()).save() // Esto causara un error
Now if we delete the
Si borramos la instancia Face instance, the Nose will go too:
Face, Nose también sera eliminada:def f = Face.get(1) f.delete() // both Face and Nose deleted
def f = Face.get(1) f.delete() // Ambos Face y Nose serán eliminados
To make the relationship a true one-to-one, use the
Para hacer que la relación sea verdaderamente uno-a-uno, utilice la propiedad hasOne property on the owning side, e.g. Face:
hasOne en el lado que define la posesión, por ejemplo, Face:Example C
Ejemplo C
class Face {
static hasOne = [nose:Nose]
}class Nose {
Face face
}
Note that using this property puts the foreign key on the inverse table to the previous example, so in this case the foreign key column is stored in the
Tenga en cuenta que al hacer uso de esta propiedad, la clave externa sera colocada en la tabla opuesta al ejemplo anterior, por lo que en este caso la columna de clave externa se almacena en la tabla nose table inside a column called face_id. Also, hasOne only works with bidirectional relationships.
nose en una columna llamada face_id. Además, hasOne sólo funciona en las relaciones bidireccionales.
Finally, it's a good idea to add a unique constraint on one side of the one-to-one relationship:
Por último, es conveniente añadir una restricción de unicidad en un lado de la relación uno-a-uno:class Face {
static hasOne = [nose:Nose] static constraints = {
nose unique: true
}
}class Nose {
Face face
}
