Por fin he añadido el soporte en base de datos de la información que creo interesante del proyecto amigo invisible online. Para ello he utilizado la JPA (java persistence API) con hibernate (basadas en el estándar JSR-220) y por supuesto Spring.
Las annotations te ahorran mucho código, más incluso que los xdoclets, y además te permite obviar completamente los incómodos archivos hbm.xml. Cómo utilizamos las annotations de hibernate?
Primero una introducción al contexto de mi proyecto. Quería persistir todo un grupo de participantes (clase Amigo) y su relación (clase Grupo), pero no quería guardar su email ni algún que otro dato, porque no quiero tener una base de datos de emails, no los quiero utilizar, y no quiero que por accidente alguna vez alguien los robe…
1.- Lo primero que hay que hacer es declarar estas clases como @Entity. De esta manera se informa que hay que persistirla y se creará automáticamente una tabla, utilizando como columnas de la tabla todos las propiedades (métodos get) que encuentre en la clase.
2.- Hay que definir una primary key a la tabla, el típico id secuencial autoincremental:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId()...
3.- Si quieres que alguna propiedad no se añada a la tabla, puedes utilizar la anotación @Transient:
@Transient
public String getEmail()...
4.- En mi caso he tenido que crear esta relación 1..N entre Grupo y Amigo:
//En la clase Amigo se define el grupo...
@ManyToOne
@JoinColumn(name="grupo")
public Grupo getGrupo()
//En la clase Grupo se define el conjunto de Amigos...
@OneToMany(targetEntity=Amigo.class,cascade=CascadeType.ALL, mappedBy="grupo")
public Collection getAmigos()
5.- Los otros campos String, Integer… puedes utilizar @Basic, pero realemente es opecional
Y hasta aquí la programación java. La configuración es muy sencilla también. Me he creado este applicationContext-db.xml, donde podéis encontrar toda la configuración necesaria. Puedes hacer un copy-paste a tu proyecto y editar solo los siguientes puntos:
<property name="annotatedClasses">
<list>
<value>com.bcurtu.amigo.pojo.Amigo</value> <value>com.bcurtu.amigo.pojo.Grupo</value>
</list>
</property>
Aquí debes enumerar las clases que quieres que se persistan.
En la propiedad hbm2ddl:
<prop key="hibernate.hbm2ddl.auto">update</prop>
Puedes utilizar los valores update (solo modifica las tablas cuando hayan cambios), create (crea el schema si no existe), create-drop (borra lo que haya y después lo creas). Configurando esta propiedad te olvidas de la necesidad de crear el schema!
Por último (aparte de configurar correctamente los parámetros de acceso a la bbdd), debés crear los beans de tu DAO. En mi caso solo tengo uno:
<bean id="grupoDao" class="com.bcurtu.amigo.db.GrupoDaoHibernate">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
Puedes bajarte el código completo del proyecto desde aquí para ver cómo encajan todos los otros componentes!