Hibernate generar un archivo SQL de nuestras entidades | Java
Hibernate nos permite generar un archivo .sql en base a nuestros modelos o
entidades que hayamos creado y anotado dentro de la etiqueta
<mapping/> en el archivo
hibernate.cfg.xml.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQL10Dialect</property>
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.connection.username">postgres</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/facturation_system</property>
<property name="hbm2ddl.auto">create</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<mapping class="model.ProductCategory" />
</session-factory>
</hibernate-configuration>
En el ejemplo anterior estamos simplemente mapeando la clase de la categoría
del producto, pero si se tiene más entidades es necesario añadirlas para poder
generar un archivo .sql más completo. Por otro lado la propiedad hbm2ddl.auto
es la que nos ayuda a generar el SQL.
Ahora lo que necesitamos es crear un método que nos permita guardar y obtener
el esquema que ha generado Hibernate en un archivo con extensión .sql como
muestra el siguiente código.
import java.util.EnumSet;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.boot.spi.MetadataImplementor;
import org.hibernate.tool.hbm2ddl.SchemaExport;
import org.hibernate.tool.schema.TargetType;
public class DatabaseUtil {
private MetadataSources metadataSources;
private MetadataImplementor metadataImplementor;
private SchemaExport schemaExport;
public void generateSQLFile(String path) {
try (StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build()) {
metadataSources = new MetadataSources(serviceRegistry);
metadataImplementor = (MetadataImplementor) metadataSources.buildMetadata();
schemaExport = new SchemaExport();
schemaExport.setDelimiter(";");
schemaExport.setOutputFile(path);
schemaExport.setFormat(true);
schemaExport.execute(EnumSet.of(TargetType.SCRIPT), SchemaExport.Action.BOTH, metadataImplementor);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Aquí hemos creado un método que recibe como parámetro el path o ubicación y nombre del archivo con su respectiva extensión si simplemente envías un nombre como por ejemplo base.sql se nos creará en la raíz del proyecto y debes refrescar o actualizar el proyecto con click derecho Refresh.
Dentro del método lo primero que hacemos es registrar un nuevo servicio con las configuraciones del archivo hibernate.cfg.xml y como se puede observar hemos instanciado dentro de un try para que se cierre automáticamente una vez finalice el bloque.
A continuación se explica de forma breve que hace cada clase utilizada:
- MetadataSources nos sirve como un punto de entrada para trabajar con fuentes de información de metadatos, en este caso decimos simplemente que ahora vamos a trabajar con metadatos del servicio registrado anteriormente.
- MetadataImplementor como explica la documentación oficial es un contrato que se realiza a nivel de SPI (Service provider interface)
- SchemaExport es simplemente una herramienta que nos permite exportar un esquema de base de datos y enviarla directamente a la base o guardarla como en este caso.
Comentarios
Publicar un comentario