Cómo conocer si el método persist ha guardado la entidad correctamente
Ago03

Cómo conocer si el método persist ha guardado la entidad correctamente

Si nuestra aplicación usa JPA, tendremos muy presente el funcionamiento del método persist para guardar entidades en la base de datos. la firma del método persist, según la especificación de JPA 2.1 (la última hasta la fecha) el método persist consta de lo siguiente: Java /** * Make an instance managed and persistent. * @param entity * @throws EntityExistsException if the entity already exists. * (If the entity already exists, the EntityExistsException may * be thrown when the persist operation is invoked, or the * EntityExistsException or another PersistenceException may be * thrown at flush or commit time.) * @throws IllegalArgumentException if the instance is not an * entity * @throws TransactionRequiredException if there is no * transaction when invoked on a container-managed * entity manager that is of type * PersistenceContextType.TRANSACTION. */ public void persist(Object entity); 12345678910111213141516 /** * Make an instance managed and persistent. * @param entity * @throws EntityExistsException if the entity already exists. * (If the entity already exists, the EntityExistsException may * be thrown when the persist operation is invoked, or the * EntityExistsException or another PersistenceException may be * thrown at flush or commit time.) * @throws IllegalArgumentException if the instance is not an * entity * @throws TransactionRequiredException if there is no* transaction when invoked on a container-managed * entity manager that is of type * PersistenceContextType.TRANSACTION.*/public void persist(Object entity); Supongamos que tenemos la siguiente situación: Queremos insertar un usuario en base de datos Queremos conocer si realmente se ha insertado el usuario en base de datos Java UserEntity e = new UserEntity(); e.setName("Name"); e.setAge(30); em.persist(e); 1234 UserEntity e = new UserEntity();e.setName("Name");e.setAge(30);em.persist(e); Con esto persistimos nuestro usuario, pero dado a que el método persist no nos devuelve ningún feedback (sea un boolean o la misma entidad), ¿Qué podemos hacer nosotros para saber si el método persist ha ido bien? Pues tenemos varias opciones: #Opción 1. Método contains del EntityManager. Documentación Podríamos tener un método propio que sobreescriba el método persist de nuestro entityManager, de manera que nos devuelva un boolean, e implementarlo de la siguiente manera. UserEntity e = new UserEntity(); e.setName("Name"); e.setAge(30); em.persist(e); ---- return em.contains(e); 123456 UserEntity e = new UserEntity();e.setName("Name");e.setAge(30);em.persist(e);----return em.contains(e); De cualquier manera, esto nos devolvería true, siempre y cuando se compruebe que la entidad esté disponible en la gestión de persistencia del entityManager, no realmente cuando hayamos añadido la misma, aunque por lo general se de en el mismo caso. #Opción 2. Devolver la id de la entidad  (o la entidad completa) Si todas las id de nuestras entidades son del mismo tipo, podríamos sobrescribir el método persist de manera que tras persistir nuestra entidad (y forzar...

Read More
Enums con JPA (Enumerated.ORDINAL vs Enumerated.STRING)
Jul22

Enums con JPA (Enumerated.ORDINAL vs Enumerated.STRING)

Cuando usamos persistencia en Java, se recomienda que cuando un campo pertenecerá a una serie de combinaciones se use un enum, ya que contaremos dentro de nuestro software con las ventajas de estos elementos enumerados, permitiendo mapear el valor con un campo de la tabla. Para ello, java nos permite usar la anotación Enumerated. Java @javax.persistence.Enumerated 1 @javax.persistence.Enumerated Esta anotación, marca nuestro campo como un dato enumerado, que puede ser de 2 tipos: Enumerated.ORDINAL (Tipo de enum por defecto) Enumerated.STRING Cada tipo, tiene sus ventajas e inconvenientes, como veremos a continuación, por lo que depende del uso que se vayamos a dar a ese enum lo que nos hará decidir que tipo usar. Enumerated.ORDINAL Es rápido y eficiente, dado que se mapeará a un valor integral en base de datos. Dado que el valor asignado a cada enum será el entero asociado a su posición, no podemos reordenarlos sin romper la integridad de los valores ya asignados a la base de datos. Podemos renombrar el campo enum sin afectar a la integridad de la base de datos. Enumerated.STRING Aporta un grado de legibilidad a la base de datos y facilidad para saber que datos se almacenan por otros usuarios de la base de datos *. Es más lento ya que relacionará el enum a un valor de la base de datos de tipo String. Se puede reordenar sin afectar a la integridad de la base de datos, pero no se puede cambiar el nombre del enum. Podemos ver más claro cómo decidir el uso en el siguiente ejemplo: UserStates, será un enum que representará el valor asignado al estado del usuario, tendrá una forma como esta. Su mejor tipo de enum es Enumerated.ORDINAL, nos permitirá renombrar los nombres de los estados y añadir los que queramos, dado que el orden en este caso no es importante: Java public enum UserStates { ACTIVE, DELETED, PENDING } 1 public enum UserStates { ACTIVE, DELETED, PENDING } Planets, este enum representará el listado de planetas del sistema solar actuales (del que ya sabemos que se sacan y meten planetas a antojo), por lo que su mejor tipo de enum es Enumerated.STRING, lo que nos permitirá cambiar el orden en caso de que se añadan o se eliminen planetas. Java public enum Planets {MERCURY,VENUS,EARTH,MARS,JUPITER,SATURN,URANUS,NEPTUNE,PLUTO,NINE} 1 public enum Planets {MERCURY,VENUS,EARTH,MARS,JUPITER,SATURN,URANUS,NEPTUNE,PLUTO,NINE} Legibilidad Sobre el tema de la legibilidad, que es tanto defendido como criticado, yo soy partidario de que es mejor que esté bien documentada la tabla y lo que se guarde realmente sea el entero siempre que sea razonable. Pensemos que la ventaja de velocidad no es tanta como la espacio disponible, el mapeo de estos...

Read More
Cómo prepararse la certificación Java 8
Jul08

Cómo prepararse la certificación Java 8

Hace poco he obtenido la certificación de Oracle  Java SE 8, concretamente la primera: Java SE 8 Programmer I (1Z0-808). Os contaré detalles de cómo prepararse para afrontarla y mi experiencia con ello. Antes que nada, esta certificación es la puerta de entrada al Mapa de certificaciones de Java disponible por Oracle. Cómo vemos, para acceder a las siguientes certificaciones, tenemos que entrar al menos por las 2 primeras (Tramo verde y Tramo Naranja). Ambas tienen un precio parecido y su temario consta en las bases y fundamentos del lenguaje Java. En cualquier caso, vamos a centrarnos en la primera, Oracle Certified Associate. Las principales caracterísitas son: Número de preguntas: 70 Porcentaje mínimo de aprobado: 65% (45.5 preguntas acertadas). Ojo! Hay que tener en cuenta, que al empezar el examen, nos informan de que no todas las preguntas puntúan, por lo que no son realmente 45.5 preguntas las mínimas para aprobar, pero aún así no nos confiamos 🙂 Duración: 150 minutos. (2 Horas y media, que pasan más rápido de lo que parecen) Tipo de preguntas: Test. Los enunciados te dirán cuantas preguntas válidas hay (Algo tipo: Selecciona 2 opciones) Por lo que te ayudará a descartar otras opciones. Precio: 245$ / 212€ Idioma: Puedes realizar este examen tanto en Inglés como en Español. Realmente como toda la preparación la vas a hacer en inglés, no te va a costar hacerlo en inglés, de cualquier modo, para evitar dudas con alguna pregunta que dé un poco de ambigüedad (Que las hay) yo lo hice en español, y tengo que decir, que la traducción no es demasiado humana, aunque se entiende sin problemas. Preguntas-tipo del examen de ejemplo: Oracle pone un mock con 8 preguntas tipo examen para hacernos una idea a que encontraremos en el mismo. ¿Por qué presentarte a una certificación Java? Presentando una cerficación demuestras, por parte de un tercero y de manera seria, que sabes de Java hasta lo que la certificación abarca, por lo que posiblemente estás indicando un plus contra otros desarrolladores. Luego con nuestra experiencia podemos demostrar que aparte de saber Java, hemos trabajado con frameworks, en frontend, etc.. A veces, una empresa, para conseguir un proyecto, necesita contar con profesionales certificados, esto quiere decir, que necesita que sus empleados o al menos un mínimo estén certificados, por lo que en el mundo de la tecnología se valora que estemos certificados (aunque como ya he dicho, no es necesario). Nos gustan los retos y queremos conocer que estamos preparados para afrontar un examen que nos pone a prueba sobre nuestros conocimientos de Java. ¿Cómo preparar la certificación Java? Lo primero, es estar mentalizados en...

Read More

Alternativa a StringUtils para Android

Una de las diferencias de las que primero te percatas cuando desarrollas en Android es la falta de clases o métodos que acostumbras a usar. StringUtils es una clase propia de Java que nos permite hacer una serie de acciones comunes mediante métodos estáticos para los tipo String (comprobar si está vacía, convertir a mayúsculas, ver si contiene una subcadena… ) con ciertas ventajas, quizá la más clara que tenga es el trato seguro de valores nulos: Java String cadena = null; cadena.isEmpty();//Así hacemos con el método isEmpty de String StringUtils.isEmpty(cadena);//Así hacemos con la clase StringUtils TextUtils.isEmpty(cadena);//Así hacemos con la clase TextUtils de Android 2 cadena.isEmpty();//Así hacemos con el método isEmpty de String En el primer caso, recibiremos un NullPointerException, ya que tenemos una referencia String a un valor vacío, por lo que no podemos usar ningún método. Cuando estamos desarrollando en Android, nos encontramos que esta clase no está incluida en su SDK, pero tiene una clase para usar como alternativa para ese tipo de funciones, esa clase es TextUtils.      ...

Read More