No borrar información de la Base de Datos con Java Persistence y hbm2ddl.auto en cada publicación de la aplicación
Tiempo total: 2 días con 9:42:23 hrs
Java Persistence es una API desarrollada para la plataforma JAVA EE y que sirve para manejar datos relacionales en aplicaciones JAVA. El problema que soluciona esta publicación es simple, cuando se utiliza esta API y se publica en la web la aplicación utilizando una adaptación de un ejemplo base observe que las tablas se eliminaban de la base de datos.
Java Persistence maneja conexiones hacia distintas bases de datos, en mi caso utilizando DataSources. Una plantilla de persistence.xml es la siguiente:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name="primary"> <jta-data-source>DS_NAME</jta-data-source> <properties> <property name="hibernate.show_sql" value="false" /> <property name="JNDI_NAME" value="POOL_NAME" /> <property name="hibernate.hbm2ddl.auto" value="validate" /> </properties> </persistence-unit> </persistence>
Aquí observamos los parámetros DS_NAME y POOL_NAME que hacen referencia al DataSource de la conexión, la propiedad que soluciona el problema de eliminar todas las tablas de la base de datos y crearlas de nuevo es la propiedad hibernate.hbm2ddl.auto, sus posibles valores son los siguientes:
- Validate = Valida el esquema de la base de datos sin realizar cambios a la información.
- Update = Solo actualiza la base de datos una vez es creado el esquema.
- Create = Crea la base de datos eliminando el esquema existente.
- Create-drop = Crea una nueva base de datos y la elimina cuando la SessionFactory es destruida. SessionFactory es la que se encarga de definir todas las variables necesarias para que Hibernate funcione correctamente.
Create-drop es la opción por defecto de la plantilla ejemplo, y en mi caso lo soluciono con la opción Validate, preservando la información de la base de datos ante cualquier inconveniente.
Referencias
[http://cyberhotel.wordpress.com/2008/03/05/definicion-de-la-sessionfactory/]
[http://stackoverflow.com/questions/10633263/what-is-the-use-of-hibernate-hbm2ddl-auto-property-in-hibernate-config]
[http://es.wikipedia.org/wiki/Java_Persistence_API]
[http://aitorsouto.wordpress.com/2011/07/25/configuracion-de-hibernate-en-eclipse/]
[http://www.coderanch.com/t/531956/ORM/databases/hbm-ddl-auto-option-hibernate]