Métricas desarrollo
● Todos los controladores asíncronos que no sean de API tendrán el prefijo
AJAX p.e. /ajax/inventario/cancel, pero si son de API serán como se indica: /
api/v1/inventario/cancel. Todos los controladores asíncronos se omite el
prefijo: /ajax o /api…
● Todas las tablas deben llevar STATUS y FCREACION
● Todos los forms y modales se deben validar a los datos mínimos necesarios
sean asíncronos o síncronos
● En forms asíncronos, al añadir un dato limpiar form y colocar focus en el
campo de búsqueda
● En Service en todas los métodos que hagan varias insert,delete o update
anotar con @transactional
● Mensajes para usuario muy amigables en primera persona
● Comentar todos los controladores que NO sean muy obvios, esto por si hacen
varias funciones dentro del mismo
● Colocar 2 y 3 enter entre funciones en archivos java y JS
● Usar en java métricas camel case, en HTML snake case, en JS camel case
● Probar todos los objetos con null para realizar operaciones
● Todos los ID en java son Long y en el método de return validar que si es null
retorne cero con operador ternario
● Todas las funciones ajax que impriman el error en consola
● Todas las funciones de consulta considerar un numero de máximo 100
registros, status ACTIVO, etc.
● Todos los métodos de service por JDBC colocar en el nombre del método el
sufijo Jdbc p.e. deleteAllJdbc(…)
● Todas las búsquedas ordenar por idDesc o del mas reciente
● No usar findAllBy a menos que sea una operación aritmética o similar, usar
fintTop100 o paginar
● En JS los eventos de modal dentro de la función que lo muestra para
encontrarlo fácil??
Pruebas Web
● Probar todos los botones y links de la vista
● Probar envío vacío de formularios, con lo mínimo requerido y con datos
completos cotejando en BD los resultados
● Probar que las búsquedas no consideren campos inactivos, borrados, etc.
Añadir dependencia JAR en Maven
1. Colocar esto en [Link]
<dependency>
<groupId>[Link]</groupId>
@OneToOne
public class Avaluo {
@OneToOne
@JoinColumn(name = "Tramite_idTram")
private Tramite tramite;
public class Tramite {
@OneToOne(mappedBy = "tramite")
private Avaluo avaluo;
}
// SAVE
Tramite tramite = new Tramite("Proyecto ejecutivo", new Timestamp(new
Date().getTime()));
[Link](tramite);
Avaluo avaluo = new Avaluo("hidalgo #102");
[Link](tramite);
[Link](avaluo);
// UPDATE
Tramite tramite2 = [Link]([Link], 2);
Avaluo avaluo2 = new Avaluo("calzada veracruz #1000");
[Link](tramite2);
[Link](avaluo2);
@OneToMany
public class Tramite {
@OneToMany(mappedBy = "tramite")
private Set<DiarioCliente> diarioClienteSet;
public class DiarioCliente {
@ManyToOne
@JoinColumn(name = "Tramite_idTram")
private Tramite tramite;
Tramite tramite = new Tramite("Ampliación", time);
Tramite tramite2 = new Tramite("Crédito", time);
[Link](tramite);
[Link](tramite2);
DiarioCliente diarioCliente = new DiarioCliente("Entrada 1", time);
DiarioCliente diarioCliente2 = new DiarioCliente("Entrada 2", time);
DiarioCliente diarioCliente3 = new DiarioCliente("Entrada 3", time);
[Link](tramite);
[Link](tramite);
[Link](tramite2);
[Link](diarioCliente);
[Link](diarioCliente2);
[Link](diarioCliente3);
// Update
Tramite tramite4 = [Link]([Link], 2);
DiarioCliente diarioCliente4 = new DiarioCliente("Nueva Entrada 1", time);
[Link](tramite4);
[Link](diarioCliente4);
@ManyToMany
public class Inmueble {
@ManyToMany(fetch = [Link], cascade = {[Link]})
@JoinTable(name = "InmuebleImagenMap",
joinColumns = { @JoinColumn(name = "idInm") },
inverseJoinColumns = { @JoinColumn(name = "idImg") })
private List<Requisicion> imagenes = new ArrayList<>();
public class Imagen {
@ManyToMany(mappedBy = "imagenes")
private List<Inmueble> inmuebles = new ArrayList<>();
}
Timestamp time = new Timestamp(new Date().getTime());
Inmueble inmueble1 = new Inmueble("terreno", "morelos #100");
Inmueble inmueble2 = new Inmueble("casa", "hidalgo #700");
Imagen imagen1 = new Imagen("[Link]...", time);
Imagen imagen2 = new Imagen("[Link]...", time);
Imagen imagen3 = new Imagen("[Link]...", time);
[Link]().add(imagen1);
[Link]().add(imagen2);
[Link]().add(imagen1);
[Link]().add(imagen3);
[Link](inmueble1);
[Link](inmueble2);
@ManyToMany
*NOTA. En Spring se pude usar la clase “InmuebleImagen” para por ejemplo
crear una lista de en sesión y mediante AJAX
Editarla, en caso de que se requieran operaciones adicionales por ejemplo sumar
las elementos de la lista, se crea una clase wrapper en session.
public class Inmueble {
@OneToMany(fetch = [Link],
mappedBy = "[Link]”,
cascade = [Link]
)
private Set<InmuebleImagen> inmuebleImagenSet = new HashSet<>();
// Copiar este….
@OneToMany(fetch = [Link],
mappedBy = "[Link]",cascade = [Link])
private Set<PartidaInventario> partidaInventarioSet = new HashSet<>();
public class Imagen {
@OneToMany(fetch = [Link],
mappedBy = "[Link]",
cascade = [Link]
)
private Set<InmuebleImagen> inmuebleImagenSet = new HashSet<>();
}
@Entity
@Table(name = "InmuebleImagen")
@AssociationOverrides({@AssociationOverride(name = "[Link]", joinColumns
= @JoinColumn(name = "idImg")),@AssociationOverride(name = "[Link]",
joinColumns = @JoinColumn(name = "idInm"))})
public class InmuebleImagen {
private InmuebleImagenId pk = new InmuebleImagenId();
// Campos extras :)
private String status;
@EmbeddedId
public PartidaRutaId getPk() {
return pk;
}
public void setPk(PartidaRutaId pk) {
[Link] = pk;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
[Link] = status;
}
@Transient
public Inmueble getInmueble() {
return getPk().getInmueble();
}
public void setInmueble(Inmueble inmueble) {
getPk().setInmueble(inmueble);
}
@Transient
public Imagen getImagen() {
return getPk().getImagen();
}
public void setImagen(Imagen imagen) {
getPk().setImagen(imagen);
}
}
@Embeddable
public class InmuebleImagenId implements Serializable {
private static final long serialVersionUID = -1193697384656663409L;
private Imagen imagen;
private Inmueble inmueble;
@ManyToOne
public Imagen getImagen() {
return imagen;
}
public void setImagen(Imagen imagen) {
[Link] = imagen;
}
@ManyToOne
public Inmueble getInmueble() {
return inmueble;
}
public void setInmueble(Inmueble inmueble) {
[Link] = inmueble;
}
}
Timestamp ts = new Timestamp(new Date().getTime());
Inmueble inmueble = new Inmueble("Terreno", "Hidalgo #200");
Imagen imagen1 = new Imagen("[Link]...", ts);
Imagen imagen2 = new Imagen("[Link]...", ts);
[Link](imagen1);
[Link](imagen2);
InmuebleImagen inmuebleImagen = new InmuebleImagen();
[Link](imagen1);
[Link](inmueble);
// Campos extra :)
[Link]("ACTIVO");
InmuebleImagen inmuebleImagen2 = new InmuebleImagen();
[Link](imagen2);
[Link](inmueble);
[Link]("SUSPENDIDO");
[Link]().add(inmuebleImagen);
[Link]().add(inmuebleImagen2);
[Link](inmueble);
Relaciones Manuales Alter Table
INDEX `fk_CategoriaGeneral_unidadnegocio1_idx` (`idUn` ASC),
CONSTRAINT `fk_CategoriaGeneral_unidadnegocio1`
FOREIGN KEY (`idUn`)
REFERENCES `benjies_db`.`unidadnegocio` (`idUn`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)