RedirectAttributes. Spring MVC 3.1

Muchas veces necesitamos redireccionar la vista en Spring MVC. Por ejemplo, en un Form la vista devuelve la URL pero convencionalmente nos queda en el navegador el llamadado POST realizado.
Para forzar a redireccionar en Spring 3.1 podemos hacerlo con “redirect:/” en el return del método.
Pero como veras, los atributos no viajan en el model…
Para solucionarlo tenemos la clase RedirectAttributes y su método:
redirectAttributes.addFlashAttribute(“objeto”,objeto);

Muy practico.

Java 8: From PermGen to Metaspace

Leyendo las novedades de Java 8, en donde LAMBDA es la mas importante, no puedo dejar pasar la que a mi entender es mucho mas importante:

La eliminación del PermGen a beneficio del nuevo Metaspace.

Quienes tenemos sistemas en producción hemos luchado con PermGen y sus parámetros de JVM hasta el cansancio.

En esta Pagina tenemos un detallado ejemplo, muy útil y fácil de leer (en inglés)

 

Json, problema de serializacion bi-direccional

Cuando tenemos una relación bidireccional en @annotations podemos obtener un error de serialización en Json.

En la práctica, se creará un bucle infinito intentando Serializar el objeto relacionado.

Para solucionar esto, en Jackson, tenemos estas anotaciones:

En la Collection agregamos @JsonManagedReference:


@OneToMany(mappedBy = "rubro",cascade = CascadeType.ALL,orphanRemoval=true)

@JsonManagedReference

private List<SubRubro> subrubros;

En la otra relación agregamos @JsonBackReference:


@JoinColumn(name = "rubro_id")

@ManyToOne(cascade = {CascadeType.DETACH})

@JsonBackReference

private Rubro rubro;

 

Problema solucionado.

Children, sustituto a ForEach en ZK

Cuando tenemos un bucle en ZK lo primero que pensamos es utilizar EL.
El problema es que EL no tiene el concepto de Binding tal como lo conocemos en el framework, con sus propiedades @Load, @Bind

Para solucionarlo, podemos utilizar Children.

Un ejemplo simple:


<hlayout children="@bind(frm.stocks)">

<template name="children">

<label class="atributoProducto" value="@load(each.stock)" />

</template>

</hlayout>

Donde frm es el controlador, stocks es la colección y each es cada item de la colección.

Criteria y HQL. Algunas diferencias

Algunas veces nos preguntamos las principales diferencias entre Criteria y HQL en Hibernate.

Aqui las mas importantes:

  • HQL lleva a cabo operaciones de tipo SELECT y NO-SELECT,  pero Criteria solamente trabaja con selección de datos, no podemos ejecutar consultas NO-SELECT en Criteria.
  • HQL es adecuado para ejecutar consultas estáticas, de lo cual Criteria es adecuado para consultas dinámicas.
  • HQL no soporta el concepto de paginación, pero Criteria los soporta directamente.
  • Criteria toma mas tiempo en ejecutar los procesos de consulta que HQL
  • Con Criteria estamos libres de SQL Injection porque genera querys dinámicas Pero en HQL con parámetros fijos podemos ser víctimas de SQL Injection.

Hibernate. Buscar texto utilizando criteria con case-insensitive y accent-insensitive

En Hibernate tenemos la opción de utilizar Criteria o HQL (en breve voy a realizar un comparativo).
En algún momento necesitaremos realizar búsquedas de campos de textos que ignoren acentos y mayúsculas.

En pocas líneas, podemos hacerlo en esta función genérica:


public List<T> getAll(String field,String value,Class<T> c) {

String parameter = Normalizer.normalize(value, Normalizer.Form.NFKD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

//---

Criteria criteria = session().createCriteria(c);  //Obtener la session de Hibernate antes

List<T> results = new ArrayList<T>();

criteria.add(Restrictions.eq(field, parameter).ignoreCase());

results = (List<T>) criteria.list();

return results;

}

Vamos a comentarla:

La función Normalize nos eliminará los tildes. En esta entrada se explica mejor

En esta línea criteria.add(Restrictions.eq(field, parameter).ignoreCase());  tenemos la orden de ignorar las mayúsculas o minúsculas.

Todo armado con Criteria.

Simple pero útil código.