domingo, 9 de diciembre de 2012

configurar hibernate usando archivo properties y hibernate.cfg.xml

el archivo hibernate.cfg.xml establece los parametros de conexion a la base de datos y las classes que se nescesitan mapear, pero si este archivo se encuentra dentro de nuestra aplicacion y la queremos distribuir en forma de jar, hay un problema, el usuario tendria que tener instalada su base de datos con el usuario y contraseña que nosotros hubieramos establecido en el codigo. de otro modo tendria que compilarse la aplicacion para cada persona que le demos el programa, cada vez con usuario y contraseña distintos.

una solucion es usar un archivo con extension .properties, donde se establecen los parametros de conexion dejando en el hibernate.cfg.xml solo el mapeo de clases.

el archivo .properties debera contener por ejemplo lo siguiente*

hibernate.connection.driver_class = org.postgresql.Driver
hibernate.connection.url = jdbc:postgresql://localhost/mydatabase
hibernate.connection.username = myuser
hibernate.connection.password = secret
hibernate.c3p0.min_size=5
hibernate.c3p0.max_size=20
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect


*http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html

el hibernate.cfg.xml queda solo con (por ejemplo)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.show_sql">true</property>
    <mapping class="dto.Grupo" ></mapping>
    <mapping class="dto.Contacto" ></mapping>
    <mapping class="dto.ContactoGrupo" ></mapping>
    <mapping class="dto.Usuario" ></mapping>
  </session-factory>
</hibernate-configuration>


y en nuestro codigo java

try {
            Properties properties = new Properties();
            properties.load(new FileInputStream("miarchivo.properties"));
            Configuration cfg = new AnnotationConfiguration().configure(); //esta linea lee a hibernate.cfg.xml
           
            cfg.addProperties(properties); //esta otra lee el properties
            sessionFactory = cfg.buildSessionFactory();
           
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }

 tambien puede dejarse el archivo hibernate.cfg.xml fuera de la aplicacion pero el usuario veria informacion que no le interesa como el mapeo de classes (pero no deja de ser otra opcion)

3 comentarios:

  1. ese codigo java que pusiste es el que vendria a sustituir al que te genera el HIbernateUtil o me equivoco ?? el codigo que te genera es este
    private static final SessionFactory sessionFactory;

    static {
    try {
    // Create the SessionFactory from standard (hibernate.cfg.xml)
    // config file.
    sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
    } catch (Throwable ex) {
    // Log the exception.
    System.err.println("Initial SessionFactory creation failed." + ex);
    throw new ExceptionInInitializerError(ex);
    }
    }

    public static SessionFactory getSessionFactory() {
    return sessionFactory;
    }

    ResponderEliminar