<?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>Diario de Programación &#187; base de datos</title>
	<atom:link href="http://blog.chuidiang.com/tag/base-de-datos/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chuidiang.com</link>
	<description>Programación e informática en general</description>
	<lastBuildDate>Wed, 25 Jan 2012 23:17:43 +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: Annotations vs XML</title>
		<link>http://blog.chuidiang.com/2009/02/12/hibernate-annotations-vs-xml/</link>
		<comments>http://blog.chuidiang.com/2009/02/12/hibernate-annotations-vs-xml/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 18:49:41 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[annotations]]></category>
		<category><![CDATA[base de datos]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=498</guid>
		<description><![CDATA[En varias ocasiones he visto sobre el tema de persistencia en java la discusi&#243;n de si es mejor usar annotations o ficheros de configuraci&#243;n XML. Mi primera opini&#243;n, sin pensar mucho m&#225;s, es que era mejor los ficheros de configuraci&#243;n XML, sin lugar a dudas. &#191;Por qu&#233;?. Pienso que los bean de java deben ser [...]]]></description>
			<content:encoded><![CDATA[<p>En varias ocasiones he visto sobre el tema de persistencia en java la discusi&oacute;n de si es mejor usar annotations o ficheros de configuraci&oacute;n XML. </p>
<p>Mi primera opini&oacute;n, sin pensar mucho m&aacute;s, es que era mejor los ficheros de configuraci&oacute;n XML, sin lugar a dudas. &iquest;Por qu&eacute;?. Pienso que los bean de java deben ser reutlizables de proyecto en proyecto, que la base de datos es un tema aparte cuyas tablas pueden cambiar de un proyecto a otro y no me gusta meter dependencias de jar raros en mis clases b&aacute;sicas del modelo de datos. Las annotations de persistencia necesitan esos jar para compilar. De alguna forma, pienso que estoy &quot;casando&quot; mis clase con una herramienta espec&iacute;fica.</p>
<p>Sin embargo, ahora que <a href="http://blog.chuidiang.com/2009/02/10/otra-vez-hibernate/">me he metido a jugar un poco con hibernate</a> m&aacute;s en serio y empiezo a comprender la filosof&iacute;a de trabajo de estas herramientas de persistencia, empiezo a dudar si es mejor los ficheros XML.</p>
<p>Por un lado, estoy mal acostumbrado en los proyectos en los que trabajo. Alguien dise&ntilde;a la base de datos primero, o incluso nos la da el cliente ya hecha y tenemos que hacer c&oacute;digo para tratar con esa base de datos. De proyecto en proyecto, aunque la tem&aacute;tica es la misma, nos hacen cambios en las bases de datos. Por ello, nuestras aplicaciones pretenden tener su propio modelo de datos a base de java beans y tratan de aislarse lo m&aacute;s posible de los detalles de la base de datos. El <a href="http://www.chuidiang.com/chuwiki/index.php?title=Patr%C3%B3n_DAO">patr&oacute;n DAO</a> se nos hace fundamental.</p>
<p>Pero veo que la forma de trabajo de Hibernate est&aacute; pensada al rev&eacute;s. T&uacute; te haces tu modelo de datos con java beans y te olvidas de la base de datos. Con annotations o con ficheros XML haces el mapeo de esos beans sobre la base de datos e Hibernate se encarga de crear todas las tablas. Y pens&aacute;ndolo de esta forma, en que lo principal son tus java beans y las tablas de base de datos son &quot;secundarias&quot;, empiezo a ver ventajas en las annotations sobre los ficheos XML.</p>
<p>Si se hacen java beans y ficheros XML de mapeo separados, estamos hasta cierto punto violando <a href="http://es.wikipedia.org/wiki/DRY">el principio DRY</a> (Don`t repeat yourself). Si tocamos los java beans, debemos acordarnos de tocar el XML correspondiente y al rev&eacute;s. Debemos tocar en dos sitios distintos si cambia el tipo de una columna, a&ntilde;adimos o borramos un atributo a un java bean, etc. Con annotations es m&aacute;s dificil el despiste. Si cambio un atributo, lo a&ntilde;ado o lo borro, la annotation est&aacute; justo al lado y es m&aacute;s dif&iacute;cil olvidarse de ella.</p>
<p>Adem&aacute;s, si vamos a reutilizar nuestros beans en otros proyectos y vamos a seguir el mismo mecanismo de persistencia, dejando a Hibernate o la herramienta de turno crear las tablas de base de datos, no es tan malo llevarse los bean con sus annotations. De hecho, es m&aacute;s c&oacute;modo que llevarse los bean y adem&aacute;s sus ficheros xml.</p>
<p>La &uacute;nica pega que le veo a esto es que las annotations en ocasiones se complican demasiado, quitando claridad a un c&oacute;digo en principio simple (un java bean). Y como ejemplo, este trozo de c&oacute;digo sacado de la documentaci&oacute;n de Hibernate, donde s&oacute;lo se empieza a declarar la clase Forest (si, f&iacute;jate al final, la &uacute;ltima l&iacute;nea&#8230;.)</p>
<blockquote>
<pre class="programlisting">
@Entity
@BatchSize(size=5)
@org.hibernate.annotations.Entity(
        selectBeforeUpdate = true,
        dynamicInsert = true, dynamicUpdate = true,
        optimisticLock = OptimisticLockType.ALL,
        polymorphism = PolymorphismType.EXPLICIT)
@Where(clause=&quot;1=1&quot;)
@org.hibernate.annotations.Table(name=&quot;Forest&quot;, indexes = { @Index(name=&quot;idx&quot;, columnNames = { &quot;name&quot;, &quot;length&quot; } ) } )
@Persister(impl=MyEntityPersister.class)
public class Forest { ... }</pre>
</blockquote>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/02/12/hibernate-annotations-vs-xml/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Otra vez Hibernate</title>
		<link>http://blog.chuidiang.com/2009/02/10/otra-vez-hibernate/</link>
		<comments>http://blog.chuidiang.com/2009/02/10/otra-vez-hibernate/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 20:09:00 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=494</guid>
		<description><![CDATA[&#160; Hace alg&#250;n tiempo me puse a jugar con Hibernate y no me caus&#243; demasiada buena impresi&#243;n. Me daba muchos problemas, las herramientas que bajaba parecian bastante descuidadas, no me funcionaba nada bien sin tener que pelearme con ello y un sin fin de descalabros. Pero estos d&#237;as atr&#225;s me entr&#243; remordimiento de conciencia. De [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Hace alg&uacute;n tiempo <a href="http://blog.chuidiang.com/category/herramientas/hibernate/">me puse a jugar con Hibernate</a> y no me caus&oacute; demasiada buena impresi&oacute;n. Me daba muchos problemas, las herramientas que bajaba parecian bastante descuidadas, no me funcionaba nada bien sin tener que pelearme con ello y un sin fin de descalabros. Pero estos d&iacute;as atr&aacute;s me entr&oacute; remordimiento de conciencia. De aquella, hab&iacute;a empezado supongo que de mala manera, sin saber nada de hibernate, tratando de arrancar las herramientas de &quot;<a href="http://www.chuidiang.com/chuwiki/index.php?title=Ingenier%C3%ADa_inversa_con_Hibernate">ingenier&iacute;a inversa</a>&quot;, es decir, tratar de sacar de las tablas de base de datos ya creadas los bean de java y los xml de mapeo. As&iacute; que hace unos d&iacute;as me decid&iacute; a retomar el tema desde cero, empezando con <a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/">la documentaci&oacute;n de Hibernate</a> y sigui&eacute;ndola m&aacute;s o menos paso a paso.</p>
<p>Pues creo que me reafirmo en mi idea. La documentaci&oacute;n, aunque est&aacute;n claros los conceptos que explica, deja bastante que desear en cuanto a c&oacute;mo arrancar el ejemplo. Ahi van algunas pegas:</p>
<ul>
<li>Si te bajas hibernate, no vienen ah&iacute; todos los jar necesarios. Aparte del conector con la base de datos, se echa en falta una implementaci&oacute;n para slf4j-api. Hibernate trae la Api, pero no la implementaci&oacute;n y no funciona el ejemplo sin una implementaci&oacute;n. S&iacute;, la documentaci&oacute;n dice que es necesaria una implementaci&oacute;n en el punto 3.5,&nbsp; pero el ejemplo y el arranque del mismo est&aacute; en el punto 1.2. No parece el orden adecuado eso de &quot;t&uacute; arranca, que m&aacute;s adelante te dir&eacute; qu&eacute; est&aacute; mal&quot;.</li>
<li>Si intentas la configuraci&oacute;n con maven, en la documentaci&oacute;n no pone el groupId a usar, sino una variable ${groupId} que no est&aacute; definida en ning&uacute;n sitio. Bueno, no cuesta mucho inventarse un valor y sacarlo, pero podr&iacute;an haberlo puesto. Por cierto, tampoco pone la versi&oacute;n.</li>
<li>Si sigues con maven, no se baja el jar de javassist, sea lo que sea eso. El caso es que en el pom.xml debes poner la dependencia a mano y en la documentaci&oacute;n no lo indica.</li>
<li>Adem&aacute;s, por supuesto, falta la dependencia de la implementaci&oacute;n de slf4j-log4j (o el logger que quieras). La podemos poner sin problemas, pero hay que tener cuidado, porque la versi&oacute;n que se ponga de dicha implementaci&oacute;n debe coincidir con la versi&oacute;n de slf4j-api de la que depende hibernate y, que por supuesto, tampoco se ve directamente en ning&uacute;n sitio.</li>
</ul>
<p>En fin, que el ejemplo muy bien, pero ponerlo en marcha cuesta unos cuantos ensayo, error y googlear, a&ntilde;adiendo dependencias y jars, seg&uacute;n nos van saliendo errores. No me extra&ntilde;an nada <a href="http://blog.chuidiang.com/2007/11/18/jugando-con-hibernate/comment-page-1/#comment-1494">comentarios como este de Nicol&aacute;s</a>.</p>
<p>As&iacute; que como siempre, copiando de la documentaci&oacute;n y ampli&aacute;ndola precisamente en estas peque&ntilde;as pegas, ah&iacute; va mi &quot;<a href="http://www.chuidiang.com/chuwiki/index.php?title=Ejemplo_sencillo_con_Hibernate">Hola mundo con hibernate</a>&quot;, en el que espero quede m&aacute;s claro exactamente que jars necesitamos y c&oacute;mo arrancar la aplicaci&oacute;n de la documentaci&oacute;n.</p>
<p>Y de paso, sigo leyendo la documentaci&oacute;n dichosa, a ver si aprendo algo de Hibernate. Lo que he leido y probado hasta ahora me est&aacute; gustando bastante.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2009/02/10/otra-vez-hibernate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Python con MySQL</title>
		<link>http://blog.chuidiang.com/2008/05/01/python-con-mysql/</link>
		<comments>http://blog.chuidiang.com/2008/05/01/python-con-mysql/#comments</comments>
		<pubDate>Thu, 01 May 2008 05:01:49 +0000</pubDate>
		<dc:creator>Chuidiang</dc:creator>
				<category><![CDATA[Lenguajes de Programación]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[programación]]></category>

		<guid isPermaLink="false">http://blog.chuidiang.com/?p=366</guid>
		<description><![CDATA[&#160; Hay una tonter&#237;a de la conexi&#243;n de python con MySQL que me ha llamado la atenci&#243;n y aprovecho para comentar aqu&#237;. El tema es que seg&#250;n obtengamos el cursor de la conexi&#243;n para hacer las consultas, podemos acceder a los resultados de una manera o de otra. Si obtenemos el cursor de esta manera [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>Hay una tonter&iacute;a de la conexi&oacute;n de <em>python </em>con <em>MySQL </em>que me ha llamado la atenci&oacute;n y aprovecho para comentar aqu&iacute;. El tema es que seg&uacute;n obtengamos el cursor de la conexi&oacute;n para hacer las consultas, podemos acceder a los resultados de una manera o de otra.</p>
<p>Si obtenemos el cursor de esta manera</p>
<blockquote>
<p>conn = MySQLdb.connect (&#8230;.)<br />
cursor = conn.cursor()</p>
</blockquote>
<p>una vez que hagamos una consulta y obtengamos una de las filas resultado, debemos acceder a cada uno de los campos usando un &iacute;ndice de un array</p>
<blockquote>
<p>cursor.execute (&quot;select * from tabla&quot;)<br />
fila = cursor.fetchone()<br />
# para acceder al primer campo<br />
print fila[0]&nbsp;&nbsp;</p>
</blockquote>
<p>Sin embargo, al obtener el cursor podemos decir que queremos que las filas sean <em>dictionaries</em>, en vez de <em>tuplas</em>, de manera que podemos acceder a los campos usando el nombre del campo, en vez de un &iacute;ndice. Para ello, basta con obtener el cursor de esta manera</p>
<blockquote>
<p>conn = MySQLdb.connect (&#8230;)<br />
cursor = conn.cursor(MySQLdb.cursors.DictCursor)</p>
</blockquote>
<p>y as&iacute; podemos acceder a los campos a trav&eacute;s de su nombre</p>
<blockquote>
<p>cursor.execute(&quot;select * from tabla&quot;)<br />
fila = cursor.fecthone()<br />
# para acceder a uno de los campos<br />
print fila[&quot;nombre_columna&quot;]</p>
</blockquote>
<blockquote></blockquote>
<p>Una tonter&iacute;a, pero estoy acostumbrado a java y a C++ y no a lenguajes tan flexibles.</p>
<p>
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chuidiang.com/2008/05/01/python-con-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

