Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Wednesday, 10 June 2009

Minimum spanning tree con Delphi (Parte I)

En este artículo os presento mi solución al Minimum spannin tree (Árbol recubridor mínimo) con una pequeña aplicación en Delphi 2009. Para esta aplicación, he implementado el algoritmo del Prim (en la wiki podéis encontrar una buena descripción del algoritmo). Mediante una imagen, con una serie de puntos aleatorios, lo que hago es escanear la imagen pixel a pixel hasta ir encontrando los puntos que hay marcados en la imagen. Una vez reconocidos los puntos, los guardo en una lista de Puntos y a partir de aquí creo la lista de adyacencias, ya que la conexión es n-ária, todos contra todos, y de lo que se trata es de conseguir el árbol recubridor mínimo que engloba todos los puntos. Una vez tengo los puntos, las conexiones y su peso (en pixels), puedo pasar a generar mi solución con el algoritmo del Prim. En esta versión he puesto un límite de 100 nodos, aunque el coste de la operación es bastante bajo (O(n^2)). En mi propuesta, podremos cargar diferentes imágenes e ir viendo su coste:


Como podéis ver, en una primera instancia, tenemos la imagen con los puntos marcados aleatoriamente (lo podemos hacer con el Paint con la medida de 1 Pixel).

Una vez los he marcado i reconocido, los marco con un color Fucsia para indicar que el programa ha reconocido los puntos de la imagen. Si miramos la lista de puntos podemos ver:


1 X: 76 Y: 44 Color: 9718288
2 X: 100 Y: 126 Color: 3581348

3 X: 108 Y: 72 Color: 16149651

4 X: 178 Y: 91 Color: 6455125

5 X: 180 Y: 61 Color: 3485918

6 X: 191 Y: 27 Color: 13378705

7 X: 219 Y: 7 Color: 2409329

8 X: 230 Y: 122 Color: 10836242


Que ha encontrado 8 puntos en las posiciones X y Y i además el color que ha encontrado. Ahora solo tenemos que generar la lista de adyacencias, todos contra todos y encontrar el árbol mínimo.

Podemos ver que en la diagonal de la matriz siempre tienen que aparecer ceros, ya que estamos calculando la distancia de un punto a si mismo, por lo tanto no puede ser diferente de cero.

Si ahora pasamos el algoritmo del prim, el programa encontrará el árbol conector mínimo y nos indicara el coste de este árbol en pixels:

Si hacemos click sobre el botón de conectar puntos, nos mostrará el grafo total con las conexiones de todos los puntos:

Si hacemos lo mismo con el ejemplo anterior obtendremos:

Como podéis ver en la última imagen, si generamos una conexión de todos contra todos no se entiende nada, pero esta es la imagen del grafo total. Aquí os dejo la aplicación para que la probéis: ThundaxSpanningTree.exe, y un par de imagenes de prueba para que hagáis vuestras comprobaciones. ejemplo1.bmp, ejemplo2.bmp.

  • Enlaces de interés:
http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic28/
http://www.algorithm-code.com/wiki/Prim%27s_algorithm

Aquí podemos encontrar diferentes muestras con Applets:

http://students.ceid.upatras.gr/~papagel/project/prim.htm

http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/Prim.shtml


Monday, 25 May 2009

QR Code

QR Code (Quick Response) son un nuevo tipo de código de barras que puede contener mucha más información que un simple código de barras, incluyendo caracteres alfanuméricos e incluso otros alfabetos (japonés, cirílico, etc). Estos códigos son facilmente legibles mediante el teléfono móvil, se descarga un software especial de escaneo, y mediante la cámara de fotos del móvil, se marca la imagen, y luego podemos leer el contenido. La imagen que podéis ver en esta página y en la web es un código QR y hay en el la dirección de mi web (ThundaxSoftware). En el siguiente vídeo, podéis ver un anuncio de japón mostrando el funcionamiento del QR Code. Ahora se está explotando mucho, sobretodo en temas comerciales (vallas publicitarias), información de productos, comida, etc. Mediante este código por ejemplo podemos la lista entera de la composición de un producto con sus características. La verdad es que da mucho juego, y como que es un código de formato libre, podemos implementar los programas para que lean este tipo de código.

Podemos descargar la aplicación para nuestro móvil, en el siguiente enlace:
Nos tenemos que conectar al enlace desde nuestro teléfono, y luego descargar la aplicación para nuestro modelo en concreto.

Podemos encontrar generadores QR Online, donde podemos escribir lo que queramos automáticamente nos genera el código QR, aquí os dejo un par de enlaces:
Podemos encontrar toda la información referente a la codificación en la página oficial de qrcode y nos podemos descargar el proyecto que tienen hecho para la decodificación en java:

La web de la librería:

Aquí tengo el programa iniciado, cargando la imagen de mi web:


El log resultado de la captación de la imagen:

Starting QRCode Decoder GUI Example ...
Decoding started
Drawing matrix.
Scanning Finder Pattern.
originPoint is: (37,37)
FinderPattern at
(37,37)(147,37)(37,147)
Angle*4098: Sin 0 Cos 8388608
Version: 3
Adjust AP(1,1) to d(0,-1)
AlignmentPatterns at
(52,52)(132,52)
(52,132)(132,132)
Creating sampling grid.
Reading grid.
gridSize=29
Created QRCode symbol.
Reading symbol.
Version: 3-M
Mask pattern: 011
Correcting data errors.
Reading data blocks.

Decode result:
http://www.thundaxsoftware.org


Por lo tanto, crear aplicaciones donde podamos utilizar esta codificación es relativamente sencillo, y podemos encontrar la implementación hecha en varios lenguajes de programación.

Aquí os dejo también un par de vídeos mostrando la utilidad del QR Code:




Wednesday, 20 May 2009

Cifrado RC4

El RC4 es un algoritmo de cifrado en flujo creado en secreto por Ron Rivest en 1987 para su compañía RSA (Rivest-Shamir-Adleman). Es usado en varios productos comerciales como Lotus Notes, Secure Sockets Layer (SSL), RSA SecurPC, WatchGuard, etc.
En Septiembre de 1994 se posteó anónimamente en los Newsgroups una rutina que decía ser el RC4. Se probó contra una copia del RC4 y las pruebas indicaron que ambas rutinas actuaban de la misma forma, por lo que el RC4 ya no es un secreto. El RC4 tiene una clave de 2048 bits, lo que hace que el algoritmo sea rápido y seguro. Crea bytes aleatorios a partir de la clave y hace la operación XOR byte a byte con el archivo a cifrar.
Podemos encontrar la implementación del código en varios lenguajes de programación: Delphi, Java, .net y todos ellos libres. Aquí os dejo varios enlaces para descargaros el código fuente:
Delphi Cryptography o también Rivest Cipher 4 y Java RC4.

El diagrama del algoritmo, lo podemos encontrar en Wikipedia:

Encontrareis una buena explicación de éste en la Wikipedia, explicando la permutación de registros y como monta el cifrado.

Gracias a estos algoritmos de cifrado, podemos crear aplicaciones que lo implementen y crear mensajes bastante seguros combinando varias implementaciones de cifrados. En mi caso, por ejemplo, aquí os presento a Thundax Cript Text, una pequeña herramienta que crea mensajes cifrados mediante el cifrado RC4 y aplicando un hash SHA1 sobre la clave. De esta manera genero mensajes cifrados y muy seguros.

De esta manera, la frase "esto es una prueba" se cifra como "vRU4HmipBUiMU6qrIa6tu5ID" con una clave de 7 caracteres. El hecho de la clave genere un hash, provoca que el querer hacer un brute-force sobre este sea casi imposible.

Podéis descargar la aplicación en el siguiente enlace : Thundax Cript Text

Y aquí teneis un pequeño reto:

Encontrar la semilla del siguiente texto:

dbFsdljNAZxRzN1WHXZ4XbZ/yk82QDJ+F2GfO6xx1OASdP1DhjFObLX1xPfIBOoOF/V+qQ==
IJMOB8y2KlOrJYZJ1kngKzBw4k0ky6atojw=

Notas, la semilla como he comentado antes, pasa por un hash SHA1, y luego se encripta el texto con un cifrado RC4, la semilla no tiene más de 10 carácteres y el charset es "A-Za-z".


  • Enlaces de interés:
http://java.ittoolbox.com/code/d.asp?d=2828&a=s
http://edipermadi.wordpress.com/2009/01/02/fast-rc4-stream-cipher-implementation-on-avr/

Friday, 15 May 2009

Persistencia en Java con Hibernate (Parte II)

Ahora nos centraremos en utilizar las herramientas de Hibernate para eclipse, y poder generar los ficheros de configuración mediante asistentes, sin tener que picar todo los xml a mano. Primero necesitamos las herramientas del Hibernate, y las podemos descargar del siguiente enlace : Hibernate Tools. Una vez instalado, si iniciamos el eclipse, en este caso Eclipse JEE 3.4.2 Ganymede, podremos ver que nos aparecen unas opciones Hibernate cuando queremos hacer un nuevo proyecto:


Ahora, creamos un nuevo proyecto, y lo configuramos como indica la siguiente imagen:

Creamos un proyecto vacío, solo con las librerias y el package hecho "mySQL". Ahora lo que haremos es iniciar los asistentes de hibernate y utilizaremos ingenieria inversa para crear las clases necesarias a partir de los datos de la BD. En la primera parte de este ejemplo, creamos todo desde cero, y ahora que ya lo tenemos representado en la BD, utilizaremos lo he tenemos en la BD para generar automáticamente los fichero .java y .hbm.xml y ahorrarnos un montón de horas picando código mediante hbm2java y las tools de Hibernate.

Ahora añadiremos el fichero de configuración del Hibernate, mediante la opción anterior New -> Hibernate configuration file (cfg.xml):


Una vez tenemos el fichero hibernate.cgf.xml, vamos a crear una configuración de consola, por lo tanto vamos a new -> Hibernate Console Configuration.


Seleccionamos nuestro fichero hibernate.cgf.xml y dejamos preparado el fichero de propiedades log2j.properties, y le damos a Finish. Ahora tenemos que generar el Hibernate Reverse Engineering, que nos permitirá crear nuestras clases y ficheros hbm.xml a partir de la estructura de la BD.

Ahora, hacemos new -> Hibernate Reverse Engineering.

Hacemos next, y configuramos la consola de configuración, y luego accedemos a nuestra BD. Una vez vemos la estructura de nuestra BD, seleccionamos la tabla "users", que es la que creamos en la primera parte. Hacemos Finish, y veremos que la estructura de nuestro proyecto aparece de la siguiente manera:


Ahora, ya podemos ejecutar la aplicación para la generación de código con Hibernate. Esto lo haremos desde el menú :

Una vez dentro del Hibernate Code Generation Configurations, creamos uno nuevo, y lo configuramos de la siguiente manera:


Ahora de esta manera vemos que al hacer run, se han añadido los ficheros que queríamos sobre la tabla users y se ha generado la classe users.java como se indica en la siguiente imanen:

Ahora que ya tenemos las clases que necesitamos y los ficheros creados, modificamos los diferentes xml y añadimos las clases que gestionan el proyecto y lo iniciamos como en la parte 1 mediante la vista del "ant", y veremos que nos lista otra vez los datos de la BD:


  • Enlaces de interés:
http://docs.jboss.org/tools/3.0.0.CR1/en/hibernatetools/html_single/index.html#setup

Thursday, 14 May 2009

Persistencia en Java con Hibernate (Parte I)

Hibernate es un framework ORM (Object Relational Mapping) que nos permite convertir datos en el sistema de tipos utilizado en la POO y el utilizado en las BD relacionales. De esta manera conseguimos utilizar las propiedades de la POO sobre la BD relacional. Por lo tanto conseguiremos tener persistencia sobre nuestros objetos utilizando una BD mediante ficheros XML. Éste genera las sentencias SQL necesarias para la gestión de la conversación entre los 2 tipos, y además incrementa ligeramente el tiempo de ejecución.

Un ejemplo muy sencillo, es el de crear una clase persona con 4 atributos (dni, name, surname y phone number), y conectaremos con una BD MySQL. Por lo tanto generaremos objetos de tipo "User", y se irán almacenando en la BD (persisten en la BD). Cada vez que modifiquemos una propiedad del objeto esta se verá reflejada en la BD.

  • Que necesito para empezar?
Tener instalado el MySQL (hay varios posts de como hacerlo), luego descargar el framework del Hibernate, concretamente el Hibernate Core (la última versión). En mi caso utilizaré la versión Hibernate core 3.3.1 GA.
Una vez tenemos descargado el hibernate, lo dejamos en una ruta conocida. En mi caso y siguiendo los últimos ejemplos que he posteado, lo voy a dejar en la ruta: C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA, de esta distribución utilizaré las siguientes librerías para mi proyecto:

C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\hibernate3.jar
C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\lib\required\antlr-2.7.6.jar
C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\lib\required\commons-collections-3.1.jar
C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\lib\required\dom4j-1.6.1.jar
C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\lib\required\javassist-3.4.GA.jar
C:\Archivos de programa\dev\hibernate-distribution-3.3.1.GA\lib\required\jta-1.1.jar

Además necesitaremos el SQL Connector para MySQL, que ya lo tengo descargado y posteé el cómo hacerlo en el post: trabajando con jdbc.
En mi caso, lo tengo en :

C:\Archivos de programa\MySQL\mysql-connector-java-5.0.8\mysql-connector-java-5.0.8-bin.jar

Además, necesito descargar el SLF4J (Simple loggin facade for java), que lo encontraremos en la web www.slf4j.org, podéis descargar la última versión directamente desde aquí: slf4j-1.5.6.zip. Y como he comentado anteriormente descomprimiremos el paquete en algún lugar conocido de nuestro sistema, en mi caso lo he dejado en la ruta: C:\Archivos de programa\dev\slf4j-1.5.6, y los ficheros necesarios para nuestro proyecto son:

C:\Archivos de programa\dev\slf4j-1.5.6\slf4j-simple-1.5.6.jar
C:\Archivos de programa\dev\slf4j-1.5.6\slf4j-api-1.5.6.jar


  • Creando un proyecto simple
Ahora crearemos un pequeño proyecto muy simple, y lo vamos a hacer todo de una forma bastante manual, para ver de donde salen todos los ficheros que vamos a generar, y luego ya veremos como lo hacemos con las Hibernate tools para Eclipse.

Primero desde el Eclipse (3.4.1 Ganymede), creo un nuevo proyecto el cual voy a llamar HibernateUserMySQLTest, que contendrá una clase "User" que tendrá las propiedades de los usuarios y una clase "UserManager", que es la que se encargará de gestionar los usuarios. Luego crearé una carpeta lib, que será donde copiemos todas las librerías necesarias para nuestro proyecto y los packages mySQL.user y mySQL.data, y luego ya iremos poniendo los ficheros que toquen dentro de cada package.

En este caso la clase básica es la siguiente:

Tendremos un campo ID de tipo Long (Evitar siempre los tipos simples), y este será autoincremental y lo gestionará el mismo hibernate. Además el método setID tiene que ser privado ya que se lo gestiona él mismo.

Aquí os dejo el código fuente de las 2 clases que gestionaran el proyecto:

User.java



package mySQL;

public class User {
private Long id;
private String DNI;
private String name;
private String surname;
private String phoneNumber;

public void setSurname(String surname) {
this.surname = surname;
}

public String getSurname() {
return surname;
}

@SuppressWarnings("unused")
private void setId(Long id) {
this.id = id;
}

public Long getId() {
return id;
}

public void setDNI(String dNI) {
DNI = dNI;
}

public String getDNI() {
return DNI;
}

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}

public String getPhoneNumber() {
return phoneNumber;
}
}




UserManager.java



package mySQL;

import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

public class UserManager {

private SessionFactory sf;

public UserManager() {
try {
System.out.println("Initiating Hibernate");
sf = new Configuration().configure().buildSessionFactory();
System.out.println("Hibernate alive!");
} catch (HibernateException e) {
e.printStackTrace();
}
}

public void addNewUser(String DNI, String name, String surname,
String phoneNumber) {
try {
System.out.println("Insert data");

Session session = sf.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setDNI(DNI);
user.setName(name);
user.setSurname(surname);
user.setPhoneNumber(phoneNumber);
session.save(user);
tx.commit();
System.out.println("Data inserted");
} catch (HibernateException e) {
e.printStackTrace();
}
}

public void deleteUser(String DNI) {
try {
System.out.println("Delete data");

Session session = sf.openSession();
Transaction tx = session.beginTransaction();

List<User> ld = listUsers();
User d;

for (int i = 0; i < (ld.size() - 1); i++) {
d = ld.get(i);

if (d.getDNI().compareTo(DNI) == 0) {
session.delete(d);
}
}

tx.commit();
System.out.println("Data Delete");
} catch (HibernateException e) {
e.printStackTrace();
}
}

@SuppressWarnings("unchecked")
public List<User> listUsers() {
List<User> datos = null;

try {
System.out.println("Listing data");

Session session = sf.openSession();
Transaction tx = session.beginTransaction();
datos = session.createQuery("from User").list();
tx.commit();
session.close();
System.out.println("data listed");
} catch (HibernateException e) {
e.printStackTrace();
}

return datos;
}

@SuppressWarnings("unchecked")
public List<User> listUsers(String dni) {
List<User> datos = null;

try {
System.out.println("Listing data");

Session session = sf.openSession();
Transaction tx = session.beginTransaction();
datos = session.createQuery("from User Where dni=" + dni).list();
tx.commit();
session.close();
System.out.println("data listed");
} catch (HibernateException e) {
e.printStackTrace();
}

return datos;
}


public static void main(String[] args) {
UserManager um = new UserManager();
um.addNewUser("40345123R", "John", "Smith", "+0034876459823");
um.addNewUser("40873423D", "Ramon", "Smith", "+00348765459823");
um.addNewUser("40323453W", "Pepe", "Smith", "+00348567459823");
um.addNewUser("42345153Z", "Matias", "Smith", "+0034876478823");

List<User> ld = um.listUsers();
User d;
for (int i = 0; i < (ld.size()); i++) {
d = ld.get(i);
System.out.println("User: DNI=" + d.getDNI() + " Name=" +
d.getName() + " Surname=" + d.getSurname() +
" Phonenumber=" + d.getPhoneNumber());
}
}

}





A partir de aquí, solo falta configurar todo el entorno para que hibernate trabaje. Ahora tenemos que configurar el proyecto de la siguiente manera, como muestra la imagen a continuación:

Tenemos que crear los siguientes ficheros: user.hbm.xml que es el fichero del mapping de la clase user hacia la BD y configura los diferentes campos que tenemos. hibernate.cfg.xml, fichero que establece la configuración del hibernate, así como la conexión con la BD. log2j.properties, establece las propiedades del log4j, y build.xml és el fichero ant que establece como se generará nuestro proyecto y es el fichero que iniciaremos desde la vista ant en el Eclipse.

Los ficheros son los siguientes:

user.hbm.xml:



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//hibernate/hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="mySQL.User" table="Users">
<id name="id" column="id" type="long">
<generator class="increment"/>
</id>
<property name="DNI" type="string"/>
<property name="name" type="string"/>
<property name="surname" type="string"/>
<property name="phoneNumber" type="string"/>
</class>
</hibernate-mapping>




hibernate.cfg.xml:



<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/Webshop</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="mySQL/data/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>




log2j.properties:
log4j.rootCategory=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-5p - %m%n

build.xml:



<project name="Test Users MySQL" default="run">
<target name="init">
<property name="src.dir" value="src"/>
<property name="classes.dir" value="bin"/>
<property name="lib.dir" value="lib"/>
<property name="mainclass" value="mySQL.UserManager"/>
<path id="classpath">
<pathelement location="${classes.dir}"/>
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
</target>
<target name="prepare" depends="init">
<mkdir dir="${classes.dir}"/>
<mkdir dir="${lib.dir}"/>
</target>
<target name="compile" depends="copy-resources">
<javac srcdir="${src.dir}" destdir="${classes.dir}">
<classpath refid="classpath"/>
</javac>
</target>
<target name="copy-resources" depends="prepare">
<copy todir="${classes.dir}">
<fileset dir="${src.dir}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="run" depends="compile">
<java classname="${mainclass}" fork="true">
<classpath refid="classpath"/>
</java>
</target>
</project>




una vez tenemos generado nuestro proyecto sin ningún error, lo ejecutamos de la siguiente manera:

Nos dirigimos a la vista Ant en nuestro IDE Eclipse (Window -> Show View -> Ant):



Agregamos el build file de nuestro proyecto como aparece en la imagen, y luego para iniciar el proyecto solo tenemos que hacer doble click sobre el "run". Luego si miramos la consola nos aparecerá toda la información del hibernate, y mostrará todas las acciones que estamos haciendo sobre nuestroso objetos:

Buildfile: D:\workspace\HibernateUserMySQLTest\build.xml
init:
prepare:
copy-resources:
compile:
run:
[java] Initiating Hibernate
[java] 46 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.3.1.GA
[java] 62 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
[java] 62 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
[java] 62 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
[java] 125 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
[java] 125 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
[java] 250 [main] INFO org.hibernate.cfg.Configuration - Reading mappings from resource : mySQL/data/User.hbm.xml
[java] 312 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: mySQL.User -> Users
[java] 328 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null
[java] 390 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
[java] 390 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20
[java] 390 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
[java] 421 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: org.gjt.mm.mysql.Driver at URL: jdbc:mysql://127.0.0.1:3306/Webshop
[java] 421 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=root, password=****}
[java] 765 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: MySQL, version: 5.0.81-community-nt
[java] 765 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
[java] 812 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.MySQLDialect
[java] 812 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Transaction strategy: org.hibernate.transaction.JDBCTransactionFactory
[java] 812 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch size: 15
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch updates for versioned data: disabled
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): enabled
[java] 812 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Maximum outer join fetch depth: 2
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
[java] 828 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
[java] 828 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge
[java] 828 [main] INFO org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge - Cache provider: org.hibernate.cache.HashtableCacheProvider
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
[java] 843 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
[java] 953 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
[java] 1218 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured
[java] 1234 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - Running hbm2ddl schema update
[java] 1234 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - fetching database metadata
[java] 1234 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - updating schema
[java] 1359 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - table found: Webshop.users
[java] 1359 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - columns: [phone, name, surname, dni]
[java] 1359 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - foreign keys: []
[java] 1359 [main] INFO org.hibernate.tool.hbm2ddl.TableMetadata - indexes: []
[java] 1656 [main] INFO org.hibernate.tool.hbm2ddl.SchemaUpdate - schema update complete
[java] Hibernate alive!
[java] Insert data
[java] Hibernate: select max(id) from Users
[java] Hibernate: insert into Users (DNI, name, surname, phoneNumber, id) values (?, ?, ?, ?, ?)
[java] Data inserted
[java] Insert data
[java] Hibernate: insert into Users (DNI, name, surname, phoneNumber, id) values (?, ?, ?, ?, ?)
[java] Data inserted
[java] Insert data
[java] Hibernate: insert into Users (DNI, name, surname, phoneNumber, id) values (?, ?, ?, ?, ?)
[java] Data inserted
[java] Insert data
[java] Hibernate: insert into Users (DNI, name, surname, phoneNumber, id) values (?, ?, ?, ?, ?)
[java] Data inserted
[java] Listing data
[java] Hibernate: select user0_.id as id0_, user0_.DNI as DNI0_, user0_.name as name0_, user0_.surname as surname0_, user0_.phoneNumber as phoneNum5_0_ from Users user0_
[java] data listed
[java] User: DNI=40345123R Name=John Surname=Smith Phonenumber=+0034876459823
[java] User: DNI=40873423D Name=Ramon Surname=Smith Phonenumber=+00348765459823
[java] User: DNI=40323453W Name=Pepe Surname=Smith Phonenumber=+00348567459823
[java] User: DNI=42345153Z Name=Matias Surname=Smith Phonenumber=+0034876478823
BUILD SUCCESSFUL
Total time: 2 seconds

Podemos ver como añade los usuarios que he indicado en el código java y luego los listo. En el siguiente post, crearemos los ficheros de configuración con la herramienta del eclipse, de esta a manera veremos la diferéncia y la reducción de tiempo configurando los parámetros a mano.