Skip to content

Asociaciones composite en la lógica

José Bocanegra edited this page Feb 12, 2020 · 1 revision

Tomando como referencia el ejemplo usado en la persistencia, se tienen dos entidades: Ciudadano (Citizen) y Licencia de Conducción (DriverLicense). Ambas entidades están relacionadas por una asociación compuesta OneToMany (un ciudadano puede tener varias licencias de conducción). En este caso no puede crearse una licencia de forma aislada, sino que debe estar asociada a un ciudadano, entonces, necesitamos un método en la lógica que nos permita asociar una licencia con un ciudadano.

En la clase de la lógica de la licencia (DriverLicenseLogic) se crea el método createLicense que recibe el id del ciudadano y una DriverLicenseEntity como parámetros. Lo primero que hace el método es buscar el ciudadano correspondiente, para que este objeto quede en el contexto de persistencia.

public DriverLicenseEntity createLicense(Long citizenId, DriverLicenseEntity licenseEntity) throws BusinessLogicException {
    LOGGER.log(Level.INFO, "Inicia proceso de crear licencia");
    CitizenEntity citizen = citizenPersistence.find(citizenId);
    //...
}

Luego, debemos saber en cuál de los dos objetos se crea la asociación (en citizen o en licenceEntity). Para esto debemos tener en cuenta en cuál entidad está indicado el atributo mappedBy en la anotación @OneToMany.

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

    @PodamExclude
    @OneToMany(
        mappedBy = "citizen",
    	cascade = CascadeType.PERSIST,
    	fetch = FetchType.EAGER,
    	orphanRemoval = true
    )
    private List<DriverLicenseEntity> driverLicenses = 
        new ArrayList<DriverLicenseEntity>();

    //... 
}
}

Para el ejemplo anterior, quien tiene el atributo mappedBy es la clase CitizenEntity. Por tanto, será siempre la entidad DriverLicense, la que no tiene el mappedBy, la que se encargue de agregar el Citizen.

public DriverLicenseEntity createLicense(Long citizenId, DriverLicenseEntity licenseEntity) throws BusinessLogicException {
    LOGGER.log(Level.INFO, "Inicia proceso de crear licencia");
    CitizenEntity citizen = citizenPersistence.find(citizenId);

    //Agregamos el ciudadano a la licencia
    licenseEntity.setCitizen(citizen);
    LOGGER.log(Level.INFO, "Termina proceso de creación de la licencia");
    return persistence.create(licenseEntity);
}

Como dijimos que, debido al atributo mappedBy de la anotación OneToMany, será siempre la entidad DriverLicense la que se encargue de agregar el Citizen. Por eso usamos el médodo licenseEntity.setCitizen(), pasándole como parámetro citizen.

Finalmente, persistimos la licencia y el método retorna la licencia que tendrá asociado el ciudadano.

Clone this wiki locally