-
Notifications
You must be signed in to change notification settings - Fork 14
Asociaciones composite en la lógica
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.
Esta wiki fue creada para el curso ISIS2603 Desarrollo de Software en Equipos en la Universidad de los Andes. Desarrollado por Rubby Casallas con la colaboración de César Forero, Kelly Garcés, Jaime Chavarriaga y José Bocanegra. Universidad de los Andes, Bogotá, Colombia. 2021.
- Instalación del ambiente en máquina propia
- Configuración de la máquina virtual
- Ejecución del back
- Uso de Codespaces
- Clases
- Herencia
- Asociaciones
- Tipos de asociaciones
- Caso de estudio: la biblioteca
- Caso de estudio: la empresa
- Java Persistence API (JPA)
- Implementación paso a paso persistencia
- Ejemplo implementación persistencia
- Carga de datos en el Backend
- Relaciones compartidas (Shared) OneToOne
- Relaciones compartidas (Shared) OneToMany/ManyToOne
- Relaciones compuestas (Composite) OneToMany/ManyToOne
- Conceptos básicos de REST
- Diseño API REST
- Tutorial documentación diseño API
- Implementación API REST con Spring
- Tutorial implementación API