<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; hibernate</title>
	<atom:link href="http://mundogeek.net/etiqueta/hibernate/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Wed, 08 Feb 2012 16:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Hibernate</title>
		<link>http://mundogeek.net/archivos/2007/01/27/hibernate/</link>
		<comments>http://mundogeek.net/archivos/2007/01/27/hibernate/#comments</comments>
		<pubDate>Sat, 27 Jan 2007 11:49:14 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[bbdd]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/01/27/hibernate/</guid>
		<description><![CDATA[Usar JDBC es complejo y muy dependiente de la estructura de los datos. Sería más natural y mucho más sencillo trabajar directamente con objetos, pero es imposible con las BBDD relacionales, y las BBDD orientadas a objeto están todavía muy verdes. La mejor opción entonces es utilizar un motor de persistencia, que es el componente [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mundogeek.net/archivos/2007/01/27/jdbc/" title="Tutorial sobre JDBC">Usar JDBC</a> es complejo y muy dependiente de la estructura de los datos. Sería más natural y mucho más sencillo trabajar directamente con objetos, pero es imposible con las BBDD relacionales, y las BBDD orientadas a objeto están todavía muy verdes.</p>
<p>La mejor opción entonces es utilizar un motor de persistencia, que es el componente software encargado de traducir entre objetos y registros. Un motor de persistencia de código abierto es <a href="http://www.hibernate.org/" title="Hibernate">Hibernate</a>, que nos permitirá hacer cosas como poder guardar un objeto en la base de datos simplemente con <code>session.save(miObjeto)</code> o borrarlo con <code>session.delete(miObjeto)</code>.<span id="more-975"></span></p>
<p>Usa el mecanismo de reflexión de Java, que permite a un objeto en ejecución examinarse y manipularse a sí mismo, en contra de, por ejemplo, <a href="http://java.sun.com/products/jdo/" title="JDO, Java Data Objects">JDO</a>, que necesita que modifiquemos los archivos de las clases.</p>
<p>Vamos a tener un archivo properties (hibernate.properties) o un archivo xml (hibernate.cfg.xml) para la configuración, una serie de JavaBeans que son las clases a persistir y en las que cada campo se asociará con una columna de la BBDD, y un archivo xml por cada una de estas clases (NombreClase.hbm.xml) que indica el mapping entre objetos y relaciones.</p>
<p>Este sería el aspecto del JavaBean que representa una sucursal en una supuesta aplicación:</p>
<blockquote><p><code>
<pre>package net.mundogeek.ejemplo;

public class Sucursal {
  private String director, telefono;
  private long idSucursal;

  public Sucursal(){
  }

  public Sucursal(String director, String telefono, long idSucursal) {
    this.director = director;
    this.telefono = telefono;
    this.idSucursal = idSucursal;
  }

  public long getIdSucursal(){
    return idSucursal;
  }

  public void setIdSucursal(long idSucursal) {
    this.idSucursal = idSucursal;
  }

  // ...
  // getters y setters para telefono y director
}</pre>
<p></code></p></blockquote>
<p>Y este el del fichero de mapping de hibernate correspondiente:</p>
<blockquote><p><code>
<pre>&lt;?xml version="1.0"?>
&lt;!DOCTYPE hibernate-mapping PUBLIC
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

&lt;hibernate-mapping>
  &lt;class name="net.mundogeek.ejemplo.Sucursal" table="Sucursal">
    &lt;id name="idSucursal" type="java.lang.Long">
      &lt;column name="id_sucursal" />
      &lt;generator class="native" />
    &lt;/id>
    &lt;property name="director" type="java.lang.String">
      &lt;column name="director" length="25" />
    &lt;/property>
    &lt;property name="telefono" type="java.lang.String">
      &lt;column name="telefono" length="25" not-null="true" />
    &lt;/property>
  &lt;/class>
&lt;/hibernate-mapping></pre>
<p></code></p></blockquote>
<p>Como vemos la etiqueta <code>class</code> se utiliza para asociar nuestra clase a una tabla concreta de la base de datos. Las etiquetas que se sitúan por debajo de <code>class</code> nos permiten definir la relación entre las propiedades de la clase y las columnas de la base de datos. La etiqueta <code>id</code> se usa para identificar el campo que actuará como clave primaria e indicar el tipo que va a tener (<code>Long</code> en este caso), así como la columna de la base de datos en la que se almacenará el campo y la forma de generar la clave (en este caso, <code>native</code>, que depende de la base de datos que usemos; podríamos haberle indicado por ejemplo que simplemente fuera sumando 1 cada vez con <code>increment</code>, o incluso crear nuestra propia clase generadora). A continuación tenemos una serie de etiquetas <code>property</code>, una por cada propiedad, que funcionan de forma parecida a <code>id</code>, indicando el nombre de la propiedad de la clase (atributo <code>name</code>) su tipo (atributo <code>type</code>) y la columna a la que se mapea (atributo <code>name</code> de <code>column</code>).</p>
<p>Como sabemos, las tablas también pueden tener relaciones entre ellas. En Hibernate podemos declarar relaciones N:M mediante la etiqueta <code>many-to-many</code>, 1:N con <code>one-to-many</code> y N:1 con <code>many-to-one</code>.</p>
<p>Por ejemplo podríamos tener una tabla de trabajadores y querer indicar para qué sucursal o sucursales trabaja cada uno de ellos (N:M, <code>many-to-many</code>). Tendríamos entonces una tabla sucursal, una tabla persona, y una tabla persona_sucursal para relacionarlas.</p>
<p>Veamos cómo podemos tener una colección de trabajadores en la clase <code>Sucursal</code> y que Hibernate sea capaz de rellenarla viendo la estructura de la base de datos y nuestro archivo de mapping.</p>
<blockquote><p><code>
<pre>&lt;set name="personas" table="persona_sucursal" cascade="save-update">
  &lt;key column="id_sucursal"/>
  &lt;many-to-many class="net.mundogeek.ejemplo.Persona" column="id_persona"/>
&lt;/set></pre>
<p></code></p></blockquote>
<p>Los conjuntos se representan en el archivo mapping de hibernate mediante la etiqueta <code>set</code> (también tenemos otras colecciones como <code>list</code>, <code>map</code>, <code>bag</code> o <code>array</code>). Esta etiqueta va a tener un atributo <code>name</code>, con el nombre de la propiedad de la base de datos asociada; un atributo <code>table</code>, con la tabla mediante la que implementamos la relación (persona_sucursal) y un atributo <code>cascade</code> que nos indica qué hacer con las tuplas de la tabla persona relacionadas con una sucursal cuando se modifique o borre esta sucursal (<code>save-update</code> indica inserción y modificación en cascada, <code>delete</code>, borrado en cascada; <code>all</code>, todas las operaciones en cascada y <code>none</code> ninguna).</p>
<p>La etiqueta <code>set</code> va a contener una etiqueta <code>key</code>, en la que indicamos la clave ajena del objeto actual en la tabla que implementa la relación que es la que se utiliza para diferenciar las instancias de la colección y una etiqueta <code>many-to-many</code> que indicará la clase de los objetos que vamos a tener en la colección y cuál es la clave ajena a su tabla en la tabla persona_sucursal.</p>
<p>Si quisiéramos que la asociación fuera bidireccional (una colección de las sucursales en que trabaja en la clase Persona) tendríamos que añadir otra etiqueta <code>set</code> en el mapping de Persona, pero añadiendo en este caso un atributo <code>inverse="true"</code>.</p>
<p>Las relaciones <code>one-to-many</code> y <code>many-to-one</code> funcionarían de forma parecida, solo que no necesitamos una tabla nueva, sino que tendremos una clave foránea de una de las tablas a la otra (si una persona sólo puede trabajar para una sucursal, <code>Persona</code> sólo necesita una propiedad de tipo <code>Sucursal</code> con la sucursal en la que trabaja y no una colección; el otro extremo, <code>Sucursal</code>, si necesitará una colección con las personas que trabajan en la sucursal). En Sucursal.hbm.xml tendríamos:</p>
<blockquote><p><code>
<pre>&lt;set name="personas" table="persona">
  &lt;key column="id_sucursal"/>
  &lt;one-to-many class="net.mundogeek.ejemplo.Persona"/>
&lt;/set></pre>
<p></code></p></blockquote>
<p>Y en Persona.hbm.xml:</p>
<blockquote><p><code>
<pre>&lt;many-to-one name="sucursal" column="id_sucursal"/></pre>
<p></code></p></blockquote>
<p>Ahora que ya hemos visto como indicarle a Hibernate la correspondencia entre nuestras clases y las tablas de la BBDD, vamos a ver cómo utilizaríamos esta API.</p>
<p>Lo primero que tendríamos que hacer para empezar a utilizar Hibernate sería crear un nuevo objeto <code>Configuration</code> para poder indicarle dónde se encuentra el archivo de configuración:</p>
<blockquote><p><code>
<pre>Configuration cfg = new Configuration();
cfg.configure(RUTA_ARCHIVO_CONF);</pre>
<p></code></p></blockquote>
<p>A partir del hibernate.cfg.xml podemos crea un <code>SessionFactory</code>, que es el objeto mediante el cual abrimos nuevas sesiones de Hibernate.</p>
<blockquote><p><code>
<pre>SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();</pre>
<p></code></p></blockquote>
<p>Para insertar objetos en la BBDD usaremos el método <code>save(Object objeto)</code> de <code>Session</code>, para insertar o actualizar si ya existe <code>saveOrUpdate(Object objeto)</code>, para borrar <code>delete(Object objeto)</code> y para cargar un objeto desde la BBDD <code>get(String clase, <em>Tipo</em> id)</code> o <code>load(String clase, <em>Tipo</em> id)</code> que devuelven el objeto de la clase indicada por el primer parámetro y con identificador el segundo parámetro si es que existe en la BBDD.</p>
<p>Para hacer búsquedas en la base de datos podemos usar <code>find(String consulta)</code> que devuelve una lista con los resultados, o <code>iterate(String consulta)</code> que devuelve un iterador, o bien crear un objeto <code>Query</code> usando <code>createQuery(String consulta)</code> y llamar más tarde al método <code>find()</code> del <code>Query</code>. La consulta en todos los casos estará escrita en un lenguaje similar a SQL propio de Hibernate llamado HQL (Hibernate Query Language). Otra opción sería trabajar con objetos <code>Criteria</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/01/27/hibernate/feed/</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
	</channel>
</rss>

