Skip to content

Relación compartida (shared) OneToOne

José Bocanegra edited this page Feb 13, 2020 · 2 revisions

En este ejemplo se tienen dos entidades Ciudad (City) y Ciudadano (Citizen). En el modelo conceptual se indica que una ciudad solo puede tener un ciudadano que cumple el rol de alcalde (mayor), y que un ciudadano solo puede administrar (manage) una ciudad.

ConceptualModel

En la transformación al modelo de entidades se deben crear dos asociaciones para representar la bidireccionalidad: una asociación entre CityEntity y CitizenEntity denominada mayor, y una asociación entre CitizenEntity y CityEntity llamada manage.

Como cada extremo tiene una cardinalidad 0..1, eso significa que la anotación del extremo en las dos asociaciones, debe ser OneToOne.

En este ejemplo se ha decidido que CityEntity sea la entidad dueña de la relación. Por eso, en la asociación que apunta a CityEntity (manage), se ha definido en la propiedad mappedBy el valor mayor.

Es muy importante que en este caso el método Fetch sea LAZY. Si no se establece esa propiedad, cuando se cargan los datos de la ciudad, también se cargarían los datos del ciudadano, y con los datos del ciudadano también se cargarían los datos de la ciudad, quedando así en un loop infinito de carga de datos.

Imgur

Este es el código en Java que representa a cada entidad:

@Entity
public class CityEntity extends BaseEntity implements Serializable
{
    private String name;
    
    @PodamExclude
    @OneToOne
    private CitizenEntity mayor;

    //...
}
@Entity
public class CitizenEntity extends BaseEntity implements Serializable
{
    private String name;
    
    private String address;

    @PodamExclude  
    @OneToOne(
        mappedBy = "mayor",
    	fetch = FetchType.LAZY
    )
    private CityEntity manage;

    //...
}

Un video con el paso a paso de la explicación puede consultarse en este link

Clone this wiki locally