Preparado para la Conferencia Agile-Spain 2010

Agile Spain 2010

La verdad es que poco hemos hablado sobre la I Conferencia Agile-Spain 2010 en el blog.  No voy a extenderme en este post, y hablaros de la conferencia en sí, ya que hay muchos enlaces (y muy buenos que ya lo hacen):

Leyendo precisamente al bueno de @kinisoftware el post sobre su itinerario en la Conferencia, me ha parecido una excelente idea compartir también el mio. Tengo que reconocer que ha sido realmente complicado elegir. De hecho, descarté desde el primer momento apuntarme a algún taller porque hay muchas sesiones que realmente me interesan.

Bueno sin mas, ahí va mi itinerario:

Jueves

  • Desarrollo de aplicaciones en la nube con Scrum y XP: Sin duda el presente-futuro del desarrollo de aplicaciones es en la nube. Así que mejor manera de empezar que con esta sesión.
  • Enterprise Scrum – Scrum en la empresa: Necesito una visión externa de como hacer Scrum. Nosotros llevamos dos años haciéndolo y, hay veces, que otros enfoques son interesantes para mejorar y perfeccionar.
  • Gestión ágil de la configuración: Una de las primeras cosas que quizás asuste y con las que uno se tiene que pegar, es el aprendizaje y configuración de las múltiples herramientas existentes para la gestión ágil. Seguro que aprendo mucho en este taller.
  • Prácticas de programación para hacer realidad la agilidad: Refactorización, IC y TDD: Bueno, nada de todo lo anterior es posible sin un buen equipo de desarrollo siguiendo buenas prácticas ágiles. Interesante, sin duda, la visión que den los chic@s de Paradigma sobre el tema.

Viernes

  • Ser ágil en España, un caso real con equipos de trabajo en remoto: Aunque ya se lo que van a contar @eamodeorubio y @adfernandez, compañeros de batallas en el día a día, estaré con ellos para darles apoyo y por ver los temas que surgen de la charla. La idea es que la gente participe y pregunte para hacer mas rica la sesión.
  • Itinerario de implementación Ágil en la empresa: Vale, ya se algo de ser ágil pero ¿Por dónde empiezo a implementar esto en mi empresa?. Seguro que Ángel Medinilla nos orienta un poco. Tengo mucha curiosidad por ver que cuenta, a ver si coincide con nuestra experiencia.
  • Probando tu TDD: Me da la sensación a veces que hay cosas de TDD que se me escapan o que no hago como debería. Que mejor que Carlos y Juan para orientarme un poco :-))
  • Para esta franja horaria la verdad que todavía no me he decantado. Las tres conferencias (Herramientas avanzadas de Testeo Unitario: Pex y Moles, Prácticas recomendadas para la relación Cliente-Equipo en el desarrollo ágil de software, Integrando prácticas ágiles y de experiencia de usuario en Telefónica I+D) me parecen interesantes y ya veremos en cual entro en función de las fuerzas que me queden.
  • Como colofon final, la charla de Rodrigo Corral, Diez maneras infalibles de asegurar Scrum será un fracaso, me permitirá conocer todas esas cosas que se hacen mal, pensando que se hacen bien :-).
Bueno pues parece que tengo unos días bastante apretaditos. Aprovecharemos para desvirtualizar a tanta gente que sigo por Twitter, además de compartir seguro que buenas conversaciones con otras muchas que, aunque conozco en persona, me aportaran buenas dosis de realidad.

Me hubiese gustado estar en otras sesiones mas pero había que elegir. Lo dicho, nos vemos en las conferencias. Por si hay algún follower leyendo esto recordad que seré @ialcazar :-).

Posted in agile | Tagged | 4 Comments

Trabajar con GIT con Eclipse, EGit y Github

La misión de este post es hablaros de la integración de Egit, un plugin para Eclipse que permite trabajar con GIT. Utilizaremos github.com como un repositorio público basado en GIT para nuestras pruebas.

Como entorno usaremos un Ubuntu 10.04 Lucid Lynx, y STS (Springsource Tool Suite) como IDE de desarrollo basado en Eclipse.

Conceptos iniciales

Empecemos explicando algunos conceptos. GIT es un repositorio de código distribuido, es decir, que no requiere de un repositorio central para funcionar. Su manera de trabajar difiere un poco de los tradicionales SCV (System Control Version) ya que cada desarrollador tiene una copia de todo el repositorio en su máquina.  Fue creado originalmente por Linus Torvalds y, por tanto, es característico en el mundillo linux. Lo usan por el grupo de desarrolladores del kernel de GNU/linux.

Instalación de GEdit

Si no estáis familiarizados con la instalación de plugins en Eclipse os recomendamos que leáis el siguiente enlace donde se cuenta como instalar otros plugin.

La URL para poder instalar GEdit en Eclipse es la siguiente:

http://download.eclipse.org/egit/updates

Creación de la clave para trabajar con Github

En el caso que no tengas  clave publica y privada asociada github, puedes crearla antes y posteriormente asociarlo al github o que te guíe el plugin de Egit (pongo el paso de crearlo bajo consola).

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tu_usuario/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <<añade aquí tu frase para generar la clave >>
Enter same passphrase again:
Your identification has been saved in /home/tu_usuario/.ssh/id_rsa.
Your public key has been saved in /home/tu_usuario/.ssh/id_rsa.pub.
The key fingerprint is:
00:14:ff:67:b1:ff:d3:c2:11:75:ff:ff:49:21:bb:fb tudominio@tudominio.com

La clave generada se encuentra dentro del archivo id_rsa.pub que deberemos asociar dentro del github a tu usuario.

Configuración de la clave en Eclipse

Una vez generadas las claves debemos de configurar en Eclipse donde se encuentran dichas claves. Esto es necesario ya que el acceso que realizaremos será ssh.

Para ello vamos a Window > Preferences > Network Connections> SSH2. En la pestaña General indicaremos la ubicación de nuestras claves. En mi caso:

SSH2 Home: $HOME/.ssh

Private keys: $HOME/.ssh/id_rsa

Creando un repositorio con Eclipse

Una vez instalado y configurado todo, vamos a ver como trabajar con un repositorio GIT:

En primer lugar tenemos que ir al menu contextual de la vista Proyectos, Importar > Git > Git repository.

importar

Añadimos donde se encuentra nuestra rama de trabajo: git@github.com@tu_usuario/nombre_repositorio.git.

Le añadimos como protocolo git-ssh. Esto nos modifica la cadena de conexión. Como usuario dejamos a git y damos a siguiente:

Sigamos con la configuración de GIT en Eclipse:
Si Egit se conecta te pedirá la cadena de conexión, que es la frase que has añadido para generar las claves.

Una vez conectado nos mostrará las ramas que tengamos en github asociadas y seleccionamos con el que queremos conectarnos.

Y ahora ya siguiente…

Nos dará por defecto un directorio de trabajo, que  lo podemos dejar así como el resto de datos  y pulsamos siguiente:

Ya nos queda finalizar. Podemos observar como ahora tenemos en la vista de proyectos el proyecto asociado al github con los ficheros que tuviéramos en dicha rama.

Ahora ya podemos empezar a trabajar en nuestro código!!

Enlaces de interés

Aquí os dejamos algunos enlaces de interés sobre GIT:

Esperemos os sirva de ayuda para empezar con GIT y Eclipse. En posteriores artículos intentaremos explicar como realizar otras funciones con EGit y  Github.
Equipo de Farmerdev.com.
Posted in Development/Desarrollo, Eclipse | Tagged | 7 Comments

Probando con Marick and Cia

El sábado 13 de marzo la gente de agilismo.es (powered by Autentia) la volvieron a liar. Tuve la oportunidad de asistir al último “sarao” que montaron, esta vez: Probando con Marick….si, si, Brian Marick uno de esos “locos” del Manifiesto ágil.

El caso es que allí estábamos unas 40 personas disfrutando de la charla del gran Marick, muchas caras conocidas de otros “saraos” y sobre todo mucho programador suelto.

De todo lo que se contó me quedo con algunas ideas interesantes:

-”No es lo mismo un programador con 10 años de experiencia que un programador con 1 año que hace 10 veces lo mismo”….lógico!. Lo que me da que pensar: ¿Cuántos desarrolladores con 10 años de experiencia conozco? Lo normal en este pais es ir abandonando la programación según vas avanzando en tu carrera profesional, hasta definitivamente colgar el Eclipse (o netbeans, no vamos a ser racistas) y acabar con el Project y el Word. En otros paises no ocurre esto, la profesión de “programata” está mejor vista, sino ahí tenemos al genial Marick.

- Marick distingue dos tipos de bugs:

1) Los que el programador comete por un fallo en su codificación, es decir, los bugs de toda la vida.

2) Los fallos propios de haber codificado correctamente un problema pero con una solución que no era la esperada, es decir, haber entendido mal la historia de usuario inicial y haber hecho otra cosa, que funciona, pero no es lo que el usuario esperaba.

Los primeros deberían ser detectados por el TDD, de ahí obtendremos una de las ventajas de usarlo: Disminuir el número de bugs en nuestro software.

Lo segundo, me gusta porque los fallos funcionales para Marick también son bugs.

- Los test de interfaz de usuario con herramientas como Selenium no son recomendables ya que son test muy frágiles y fáciles de romper. Cuando mas débil (fácil de romper) sea un test peor estaremos haciendo TDD.

Además de todo esto realizó un juego en el que exponía cada una de las partes que componían una aplicación y de como debían interactuar unas con otras. La conclusión principal: Hay que hacer Test Unitarios de cada elemento antes de que se pongan a interactuar unos con otros (integración).

En fin, solo me queda agradeceros tanto a agilismo.es como a Autentia por brindarnos la oportunidad de compartir estos momentos y a todos los que allí estabais por compartir vuestras experiencias y conocimientos.

Nos vemos en el siguiente.

P.D.- Las fotos son cortesía de Semurat (http://www.flickr.com/photos/semurat/sets/72157623496473597/)

Posted in Development/Desarrollo | Tagged | 1 Comment

El gimnasio para programadores y arquitectos software

Comenzamos un nuevo camino en este blog, un nuevo concepto para ayudar a todos a ser mejores programadores, diseñadores… en definitiva mejores profesionales, en muchas ocasiones nos vemos avocados en nuestro trabajo como informáticos, dentro de nuestras batallas diarias, a sacar lo que nos va surgiendo, sin poder exprimir en detalle los resultados y conocimientos adquiridos. Consideramos que la única manera para poder, mejorar y aprender es mediante un trabajo diario, una especie de entrenamiento (leer, leer, leer y programar, programar y volver a leer…). No sirve de mucho para un músico llegar a un concierto sin haber ensayado hasta la saciedad o incluso para un futbolista (por poner a “Forlan”), el entrenamiento diario supone llegar al máximo rendimiento en el partido cada fin de semana (aunque no se note mis queridos amigos atléticos…).

Es por eso que vamos publicar nuestros entrenamientos, por decirlo así. Una serie de ejercicios diarios, retos, y machaque en nuestro particular gimnasio javero. Puede ser una experiencia que puedes considerar interesante por eso te invitamos a que te unas, siempre dentro del tiempo del que dispones, incluso también os puede servir como referencia de algún tema que tratemos, aunque en este post no tenemos pensado comentar el contenido , tenemos que decir que es muy amplio y variado, pasaremos a entrenar nuestra manera de expresarnos, nuestro Java, y repasar conceptos de todo tipo , hablaremos de  ”buenas prácticas” , iremos a otros muchos temas como frameworks JEE, otros de persistencia…, nos introduciremos en el mundo de los plugins de eclipse, EMF, GMF, librerías variadas, metodologías ágiles y un gran etc… que iremos desvelando en posts sucesivos.

boxeo

Nos gustaría que nuestro “gimnasio” fuese lo más participativo posible, que vuestros comentarios siempre estuvieran presentes y aunque no sepas del tema que estes interesado, nos puedas dar sugerencias de cómo crees que se debe de hacer algo, o cómo lo has resuelto tú, además siéntete libre de plantearnos tus dudas e inquietudes.

Un saludo.

El equipo de Farmerdev.com

Posted in java developer Gym | 2 Comments

Campaña Anti-if: Por una programación orientada a objetos limpia

OOP ProgramingDesde un twitt de Kent Beck llego a esta web donde se realiza una campaña muy curiosa: Campaña Anti-if. Para los que se hayan quedado igual de extrañados que me quedé yo al entrar, la campaña intenta concienciar a los programadores de los daños que causan el excesivo uso de sentecias de control e Ifs especialmente.

En una programación orientada a objetos esta práctica provoca un alto acoplamiento entre nuestros métodos producciendo un alto coste en el mantenimiento de un proyecto de software.

Que mejor manera de entender este concepto que con un pequeño ejemplo:

Imaginemos un programa bancario que maneja cuentas. En función del tipo de cuenta con el que estemos tratando deberemos calcular el saldo. Creamos la clase Account.java donde tendremos el método que realiza el cálculo en función del tipo:


package bank;

public class Account {
public static final int NORMAL_ACCOUNT = 0;
public static final int DOUBLE_ACCOUNT = 1;

private double rate;
private double balance;
private int type;

public Account(double rate, double balance, int type) {
super();
this.rate = rate;
this.balance = balance;
this.type = type;
}
//Calculates the balance depends on account type
public void calculateBalance(){
if(this.type == NORMAL_ACCOUNT){
calculateNormalBalance();
}else if(this.type == DOUBLE_ACCOUNT){
calculateDoubleBalance();
}else{
calculateAnotherBalance();
}
}

private void calculateAnotherBalance() {
this.balance += rate *0.2;

}

private void calculateDoubleBalance() {
this.balance += rate *0.5;

}

private void calculateNormalBalance() {
this.balance += rate *0.1;

}

//GETTERS AND SETTERS
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}

El programa principal podría ser:


package main;

import bank.*;

public class Launcher {
public static void main(String[] args) {
Account account = new Account(1.0,1000,Account.DOUBLE_ACCOUNT);

account.calculateBalance();

}
}

Esto es un ejemplo claro de fuerte acoplamiento y de un pobre mantenimiento ya que si necesitamos incluir un nuevo tipo de cuenta deberemos modificar el trozo de código correspondiente a los if para añadir un nuevo tipo:


public void calculateBalance(){
if(this.type == NORMAL_ACCOUNT){
calculateNormalBalance();
}else if(this.type == DOUBLE_ACCOUNT){
calculateDoubleBalance();
}else{
calculateAnotherBalance();
}
}

¿Cómo podemos solucionar esto en un lenguaje orientado a objetos como es Java? Pues siempre que nos encontremos este tipo de situaciones en las que la implementación de un método depende del tipo de clase que hayamos creado, podremos utilizar toda la potencia del polimorfismo.

Teniendo esto en cuenta deberemos modificar la clase Account para que solo contenga las propiedades de la clase (rate y balance) omitiendo la propiedad tipo, ya que ahora ya no nos va a hacer falta. El método calculateBalance() aparece marcado con el modificador abstract ya que no sabremos su contenido hasta que no implementemos cada una de las subclases, ya que solo allí sabemos que fórmula utilizar:

package bank.oop;

public abstract class Account {
protected double rate;
protected double balance;

public Account(double rate, double balance) {
super();
this.rate = rate;
this.balance = balance;

}
<strong> //Abstract method
public abstract void calculateBalance();</strong>

//GETTERS AND SETTERS
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}

}

La clase es abstracta ya que es obligatorio en Java que los métodos abstractos se encuentren dentro de clases abstractas. La razón es muy sencilla,  ya que un método abstracto no tiene cuerpo generaría un error si pudieramos ejecutar ese método directamente:


Account account = new Account();
//ERROR: You can't do it because is a non-developed method.
account.calculateBalance();

A continuación crearemos tantas clases que herenden (extends) de Account como tipos de cuentas tengamos. En nuestro caso tenemos NormalAccount y DoubleAccount:


package bank.oop;

public class NormalAccount extends Account {

public NormalAccount(double rate, double balance) {
super(rate,balance);
}
@Override
public void calculateBalance() {
this.balance += this.rate *0.1;

}
}

package bank.oop;

public class DoubleAccount extends Account {

public DoubleAccount(double rate, double balance) {
super(rate,balance);
}
@Override
public void calculateBalance() {
this.balance += this.rate *0.5;

}

}

En ambas clases sobreescribimos el método calculateBalance() ya que ahora si sabemos las fórmulas ya que nos encontramos dentro de cada clase en concreto, por tanto sabemos que ratio aplicar.

El programa principal podría quedar así:


package main;

import bank.oop.*;

public class Launcher {

public static void main(String[] args) {
Account account = new NormalAccount(1.0,1000);

//Polymorphism allows account being some kind of Account
//Now is NormalAccount
account.calculateBalance();

//Now is DoubleAccount
account = new DoubleAccount(1.0,2000);
account.calculateBalance();

}

}

Como se puede comprobar con esta nueva implementación conseguimos un débil acoplamiento entre nuestros programas. Incluir un nuevo tipo de cuenta será tan sencillo como que herede de Account y no tendremos que modificar ningún bloque if para que el programa funcione.

No parece complicado ¿verdad?. Además el uso del polimorfismo permite que un objeto definido como Account pueda en ejecución adoptar múltiples formas (NormalAccount o DoubleAccount) segun mas convenga.

Desde FarmerDev apoyamos esta curiosa campaña. Lucharemos contra los if’s ;-)


I have joined Anti-IF Campaign

Posted in Java | Tagged | 4 Comments

Jornadas sobre tecnologías AJAX

El 19 de Octubre comienzan las segundas Jornadas sobre desarrollo de aplicaciones ricas (Rich Internet Applications) organizadas por AT Sistemas.

Se tratará de dar una visión sobre distintas librerías y frameworks AJAX para el desarrollo de aplicaciones dinámicas. No se pretende profundizar demasiado en cada librería ya que las ponencias son de un máximo de dos horas. Pero si que queremos conseguir que los asistentes salgan con un esquema de estas principales librerías, su uso, ventajas, inconvenientes, puntos a tener en cuenta. Para que así puedan decidirse por unas u otras sin necesidad de haber trabajado con ellas.

Las jornadas están orientadas principalmente a Arquitectos, Analistas y Jefes de proyecto para ayudarles en la toma de decisión de la tecnología a utilizar en un proyecto. Por supuesto que programadores también pueden asistir ya que en cada ponencia se implementará algún ejemplo práctico.

Os dejo mi ponencia sobre dos librerías muy populares para JSF:RichFaces y IceFaces.

Posted in Ajax, Development/Desarrollo | Tagged , , , , | Leave a comment

New Discover JavaScript Editor

My Co-worker Luis Toubes has discovered me a fantastic Eclipse plugin: Aptana Studio. It provides JavaScript development easier than standard JS editor.

Furthermore Aptana helps you with several AJAX frameworks such as DOJO, JQuery and so on!…

You can know more about it here :http://aptana.com/studio/

Posted in Plugins | Tagged | Leave a comment

What is the best architecture?

For few years, I’m studing and developing several JEE architectures but I wonder what is the most useful of them?

http://library.theserverside.com/

Posted in Development/Desarrollo | Tagged | 2 Comments

Despliegue de aplicaciones “en caliente”

Sin duda el desarrollo de aplicaciones web es apasionante y muchas veces tedioso cuando se realizan cambios constantes. Esos cambios implican una compilación, re-despliegue y posterior re-arranque del servidor de aplicaciones en cuestión.

Muy bien, pues el re-arrancar se va a acabar. Existe un plugin (-javaagent) para la máquina virtual de Java (JVM) llamado JavaRebel que actualmente se encuentra en su versión 2.0.

En lineas generales este plugin nos permite una vez compilado nuestro código ver los cambios en caliente, es decir, sin necesidad de un despliegue y rearranque de la máquina.

Las máquinas virtuales que soporta son:

  • Sun Java 1.4.xi, 5.x, 6.x
  • JRockit JVM 8.1sp6 or later
  • JRockit JVM 9.x 1.5.0_06 or later
  • JRockit JVM 1.6.x
  • IBM J9 1.4.x, 5.x, 6.x
  • Apple MRJ 1.4.x, 5.x, 6.x

Soporta los siguientes Contenedores y Servidores de aplicaciones:

  • IBM WebSphere 6.x
  • BEA Weblogic 8.x, 9.x, 10.x
  • GlassFish 2.x
  • Oracle OC4J 9.x, 10.x
  • Tomcat 4.x, 5.x, 6.x
  • JBoss 3.x, 4.x, 5.x
  • Jetty 5.x, 6.x, 7.x
  • Caucho Resin 3.0.x
  • Jonas 4.x
  • Equinox OSGi (including Eclipse plugins)
  • IntelliJ IDEA plugins
  • Atlassian Confluence plugins

Su funcionamiento óptimo engloba a :

  • Java EE
  • Java standalone apps
  • Groovy
  • Spring
  • Struts2
  • Google Guice
  • Tapestry 4

Para mas información y poder probarlo podéis acceder a su página web:

http://www.zeroturnaround.com/javarebel/

Posted in Java | Leave a comment

Generación de claves compuestas con Hibernate 3

Uno de los requisitos mas habituales en un modelo relacional es la existencia de claves primarias compuestas, es decir, claves que estan formadas por mas de una columna de nuestra tabla.

En nuestro caso la tabla que queremos generar tiene este aspecto:


create table hibernatedb.Address (
        addressId varchar(255) not null,
        type varchar(255) not null,
        street varchar(255) not null,
        city varchar(255) not null,
        state varchar(255) not null,
        zip varchar(255) not null,
        primary key (addressId, type)
    )default charset=latin1;

Como se puede observar tanto el identificador de dirección como el tipo de dirección forman la clave primaria.

¿Que tenemos que generar en Hibernate?

Lo normal es realizar la clave compuesta mediante un bean que represente a esta clave. De tal forma que deberemos crear una clase con las columnas que queremos que formen la clave compuesta


package beans;

import java.io.Serializable;
//Composite id
public class AddressId implements Serializable{
	private String type;
	private String addressId;

	public AddressId(String type, String customerId) {
		this.addressId = customerId;
		this.type = type;
	}

	public AddressId() {}

	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	public String getAddressId() {
		return addressId;
	}
	public void setAddressId(String customerId) {
		this.addressId = customerId;
	}
	public boolean equals(Object other) {
		if ( !(other instanceof AddressId) ) return false;
		AddressId add = (AddressId) other;
		return type.equals(add.type) && addressId.equals(add.addressId);
	}
	public int hashCode() {
		return addressId.hashCode() + type.hashCode();
	}

	public String toString() {
		return type + '#' + addressId;
	}
}

Es importante que esta clase sea Serializable y tenga sobreescritos los métodos equals y hashCode.

Ahora implementaremos la clase que realmente representa a la tabla incluyendo dentro la clave que acabamos de crear:


package beans;

import java.io.Serializable;

public class Address  implements Serializable {

	//Esta va a ser la composite-id
		private AddressId addressId;
		private String street;
		private String city;
		private String state;
		private String zip;

		public String getCity() {
			return city;
		}
		public void setCity(String city) {
			this.city = city;
		}
		public String getState() {
			return state;
		}
		public void setState(String state) {
			this.state = state;
		}
		public String getStreet() {
			return street;
		}
		public void setStreet(String street) {
			this.street = street;
		}
		public String getZip() {
			return zip;
		}
		public void setZip(String zip) {
			this.zip = zip;
		}
		public AddressId getAddressId() {
			return addressId;
		}
		public void setAddressId(AddressId addressId) {
			this.addressId = addressId;
		}
}

El archivo de mapeo de este bean Address.hbm.xml quedaría de la siguiente forma:


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="beans">
 <class name="Address">

		<composite-id name="addressId">
			<key-property name="addressId"/>
			<key-property name="type"/>
		</composite-id>

		<property name="street" not-null="true"/>
		<property name="city" not-null="true"/>
		<property name="state" not-null="true"/>
		<property name="zip" not-null="true"/>

	</class>
</hibernate-mapping>

Ahora solo nos falta el archivo de configuración de Hibernate (hibernate.cfg.xml) para hacer funcionar el 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.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernatedb</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.default_catalog">hibernatedb</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
<!--		<property name="hbm2ddl.auto">create</property>-->
		<property name="generate_statistics">true</property>
        <property name="current_session_context_class">thread</property>

        <mapping resource="Address.hbm.xml"/>

    </session-factory>
</hibernate-configuration>

Si no queremos utilizar un bean para representar la clave primaria sino que se incluye como propiedad dentro del bean estará directamente como propiedades podemos modificar la configuración de la siguiente forma:


<composite-id>
			<key-property name="addressId" type="java.lang.String">
                            <column name="ADDRESS_ID" length="2" not-null="true" />
                        </key-property>
			<key-property name="type" type="java.lang.String">
                            <column name="TYPE" length="2" not-null="true" />
                        </key-property>
		</composite-id>

En este caso la base de datos es Mysql y el schema se llama hibernatedb. También debemos tener en cuenta que el archivo de mapeos Address.hbm.xml e hibernate.cfg.xml se encuentran dentro de la carpeta de fuentes (src en Eclipse).

El programa que ejecuta el ejemplo:


package main;

import org.hibernate.classic.Session;

import beans.Address;
import beans.AddressId;

import util.HibernateUtil;

public class Lanzador {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		AddressId aid = new AddressId();
		aid.setAddressId("DirId");
		aid.setType("tipoId");

		Address address = new Address();

		address.setAddressId(aid);
		address.setCity("Madrid");
		address.setState("Madrid");
		address.setStreet("MiCalle");
		address.setZip("28900");

		Session ss = HibernateUtil.getSessionFactory().getCurrentSession();
		ss.getTransaction().begin();
		ss.save(address);

		ss.getTransaction().commit();
		//ss.close();

	}

}

Las librerías necesarias son las propias de Hibernate3 y el driver jdbc del gestor elegido:

- hibernate3.jar
- log4j.jar
- antlr.jar
- asm.jar
- asm-attrs.jar
- cglib.jar
- commons-collections.jar
- commons-logging.jar
- dom4j.jar
- jta.jar
- concurrent.jar
- ehcache.jar
- javassist.jar

Además si deseamos utilizar una herramienta para imprimir trazas de log podemos incluir log4j cuyo archivo de configuración log4j.properties es:


### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=warn, stdout

log4j.logger.org.hibernate=info
### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
Posted in Development/Desarrollo, Hibernate | Tagged | 7 Comments