100 días de código - Semana 1
Me uní al reto 100 días de código que consiste en programar durante 100 días sin interrupción, en un lenguaje que uno no domine, para que sea efectivamente un reto.
Yo elegí aprender Java y SpringBoot que es un framework con una gran cantidad de aplicaciones. El proyecto que estoy haciendo es una aplicación web, con REST API para controlar documentos.
No son muchos documentos, unos 500 documentos compuestos con unas mil fojas. Tampoco se actualizan frecuentemente, unos cuatro o cinco documentos al mes.
Uno de los requisitos más importantes es que se debe mantener un registro histórico de los documentos. Esto quiere decir que siempre se mostrará la versión más reciente, pero estará disponible para su consulta, la o las versiones anteriores.
Por supuesto tendrá facilidades de búsqueda y la posibilidad de descargar uno, todos o cualquier combinación de documentos, de acuerdo a los criterios de búsqueda.
De Django a SpringBoot
Dado que mi experiencia es con Django, estoy haciendo dos sistemas, uno con este framework y otro con SpringBoot.
No se convierten los modelos de Django a Spring, pero un ejemplo es
el siguiente: uno de los modelos más importante se llama Localidad
, en Django
se ve así:
class Localidad(models.Model):
id = models.AutoField(primary_key=True)
seccion = models.ForeignKey(Seccion, on_delete=models.CASCADE, related_name="localidad_seccion")
localidad = models.PositiveSmallIntegerField()
nombre = models.CharField(max_length=150)
tipo = models.CharField(max_length=1)
class Meta:
verbose_name_plural = 'Localidades'
constraints =[
UniqueConstraint(fields=['seccion', 'localidad'], name='idxLocalidad'),
]
def __str__(self):
return f'{self.seccion:04d}: {self.localidad:04d} - {self.nombre}'
Para usar la misma tabla en Spring, la entidad se ve como sigue:
package org.toledano.pusinex.models.entity;
import lombok.Getter;
import lombok.Setter;
import javax.persistence.*;
@Setter @Getter @Entity
@Table(name = "app_localidad", uniqueConstraints={
@UniqueConstraint( name = "idx_Seccion_Localidad", columnNames ={"seccion_id","localidad"})
})
public class Localidad {
@Id
private Integer id;
@Column(nullable = false, columnDefinition = "smallint")
private int localidad;
@Column(nullable = false, columnDefinition = "nvarchar", length = 100)
private String nombre;
@Column(nullable = false, columnDefinition = "nvarchar", length = 1)
private String tipo;
@OneToOne
@JoinColumn(name="seccion_id", referencedColumnName = "seccion")
private Seccion seccionId;
@Override
public String toString() {
return String.format("%04d", seccionId.getSeccion()) + " " + String.format("%04d", localidad) + " " + nombre.toUpperCase();
}
}
Y además de esta entidad, se tiene que crear un repositorio que
es algo así como el método objects
de Django.
package org.toledano.pusinex.models.repository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.toledano.pusinex.models.entity.Localidad;
import java.util.List;
public interface ILocalidadRepository extends CrudRepository<Localidad, Integer> {
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1 and l.seccionId.seccion = ?2 and l.localidad = ?3")
public Localidad findLocalidad(int entidad, int seccion, int localidad);
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1 and l.seccionId.municipioId.municipio = ?2")
public List<Localidad> findLocalidadByMunicipio(int entidad, int municipio);
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1")
public List<Localidad> findAll(int entidad);
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1 and l.seccionId.seccion = ?2 and l.localidad = ?3 and l.tipo = ?4")
public Localidad findLocalidadAndTipo(int entidad, int seccion, int localidad, String tipo);
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1 and l.seccionId.municipioId.municipio = ?2 and l.tipo = ?3")
public List<Localidad> findLocalidadByMunicipioAndTipo(int entidad, int municipio, String tipo);
@Query("SELECT l FROM Localidad l WHERE l.seccionId.entidadId.entidad = ?1 and l.tipo = ?2")
public List<Localidad> findAllAndTipo(int entidad, String tipo);
}
Conclusión
Al finalizar la semana, me parece que Django entrega todo, sea necesario o no. En Spring, uno crea justo lo que necesita. Pero es bueno aprender algo bueno.