Geek & Roll » programacion

Fechas legibles con PHP

Rafyta December 5th, 2012 programacion Haz un comentario

fechas con php

Para muchos tal vez sea como llover sobre mojado, pero para mí esta función representa un ahorro increíble de tiempo y no me la había topado hasta hace unas semanas.

Digamos que quieres cambiar fechas de un formato a otro. Por ejemplo si tienes “1-May-2012″ y quieres convertirla a “2012-05-01″, manualmente puede ser un tormento; pero con la función strtotime() ya puedes irte de fin de semana a acampar, escribir un libro, romper el reto de los 2 hot dogs de un kilo, o lo que sea que te guste.

echo date(“Y-m-d”, strtotime(“1-May-2012″));
–> **MAGIA**
–> 2012-05-01

Lo interesante es cuando empiezas a hacer cosas como:

echo date(“Y-m-d”, strtotime(“tomorrow”));
–> 2012-12-06

echo date(“l F jS, Y”, strtotime(“monday”));
–> Monday December 10th, 2012

echo date(“l F jS, Y”, strtotime(“a month ago”));
–> Wednesday December 5th, 2012

echo date(“l F jS, Y”, strtotime(“next week”));
–> Wednesday December 12th, 2012

echo date(“l F jS, Y”, strtotime(“end of times”));
–> Friday December 21st, 2012

Los detalles completos para hacer tu formato a la medida están en: http://php.net/manual/en/function.date.php

RockProducer, o cómo uso emacs para crear Rockofonia.

Para los que no saben de que lado masca la iguana, Rockofonia es un podcast semanal que se transmite tanto por Internet como por radio (en Baja California). Somos dos “DJs” que alternamos, por lo tanto cada 2 semanas me toca aventarme la emisión en turno. Siendo programador de profesión, siempre que me enfrento con un problema recurrente mi mente viaja y se imagina como solucionarlo con software. Ese fue el caso de No Te Pases (antes Everlasting Flame) y muchos otros proyectos tal vez no tan conocidos, pero que me han salvado de tener que repetir los mismos pasos una y otra vez, algo para lo que las computadoras se pintan solas.

El reto
En el caso de Rockofonia, siempre que me tocaba armar la emisión de la semana me enfrentaba con un problema. Verán, al inicio cuando Rockofonia no era más que un podcast no había tanto problema. Digamos que teníamos completa libertado sobre el formato, los comentarios, las canciones y sobre todo la duración de la emisión. Aunque siempre dijimos que serían de media hora, no era un límite estricto, y había emisiones que podían pasarse hasta los 40 o 50 minutos sin mayor problema. Cuando Rockofonia da el salto a la radio, la emisión se alargó a una hora. Esto nos permitió incluir mas material, pero a la vez nos restringió en la duración: la emisión tenía que durar una hora. Más bien, entre 57 y 59 minutos, sin pasarte pero tampoco sin quedarte corto. Las reglas exactas son un poco más complicadas que esas:

  1. La emisión se divide en dos bloques de media hora
  2. Puedes incluir dos canciones seguidas, pero deben llevar una cortinilla entre las dos
  3. Cada bloque debe durar 30 minutos aproximadamente, incluyendo la duración de las cortinillas, el intro y el outro
  4. La versión que se transmite por radio no incluye un segmento que dura aproximadamente 30 segundos, exclusivo para la versión por Internet
  5. La emisión completa en total no se debe pasar de 59 minutos

El reto es cuando estas planeando la emisión. Por la manera en la que se produce el programa, las voces se graban aparte y puedes terminar grabando mas material del que puedes incluir al final. Entonces, ¿Cómo llevar un control de lo que va a durar una emisión, basado en las canciones que se planean incluir y el material que se tiene para comentar entre cada emisión? Basicamente necesitamos:

  1. Una manera de calcular la duración de los segmentos musicales
  2. Una manera de calcular el tiempo disponible para los segmentos de comentarios
  3. Una manera de reorganizar las canciones de la emisión, de tal manera que los dos bloques sean de 30 minutos aproximadamente
  4. Una manera de incluir notas para la planeación de la emisión
  5. De preferencia, que la solución sea fácil de migrar entre computadoras (generalmente armo la emisión en mi PC de escritorio, pero las voces las grabo en otro sitio)

Mi primer impulso fue una aplicación Web, incluso inicié un proyecto llamado RockProducer, en donde la intención era hacer todos estos cálculos, integrar búsquedas (Wikipedia, Last.FM, Songfacts, Grooveshark entre otros) para la recopilación de material, un editor de notas para armar la emisión, distintas visualizaciones. La idea era ya teniendo algo completo, hostearlo en algún lado para todos aquellos que se dediquen a la creación de podcasts musicales y tengan los mismos retos que nosotros, pudieran usar esta aplicación para planear sus emisiones. Como dije, esa era la idea. Leer el resto de este post.

Cómo no programar una encuesta Web

Cesar May 22nd, 2011 programacion, tips 3 comentarios

Frecuentemente me encuentro con sitios que deciden atraer más visitantes, creando concursos en donde la gente vota por su participante favorito. No hay nada de malo con eso, sólo que son fácilmente abusadas si no se tiene cuidado al programarlos. Al final podemos tener un ganador que no fue la elección popular, sino el más hábil con los bits.

Supongamos que hay una encuesta para votar por la flor más bella del ejido, y tenemos a las siguientes candidatas:
La Flor Mas Bella del Ejido

De izquierda a derecha las numeramos como Flor 1, 2, 3 ,4, 5 y 6.

El programador del sitio se siente muy confiado, ya que guarda una cookie en el navegador para identificar de manera única a los usuarios y evitar que voten repetido. Empieza la votación y por alguna razón la flor #3 va en la última posición, pero esta flor tiene amigos que le saben a eso de las computadoras y les pide algo de ayuda. Lo que hacen los amigos de la flor #3 es lo siguiente (en PHP):

function xrun($email,$name){

//set POST variables
$url = ‘http://www.laflormasbelladelejido.com.mx/votar.php';
$fields = array(
‘Nombre’=>$name,
‘Email’=>$email,
‘Voto7’=>’VOTO POR LA FLOR #3′
);

$fields_string =””;

//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.’=’.$value.’&'; }
rtrim($fields_string,’&’);

//open connection
$ch = curl_init();

//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS,$fields_string);

//execute post
$result = curl_exec($ch);

//close connection
curl_close($ch);

}

Lo que hace el script anterior es enviar un HTTP POST a la URL de votación, previa preparación de las variables que espera la forma. Esto es muy fácil saberlo utilizando Firebug por ejemplo, o la consola para desarrolladores de Chrome. Para enviar el POST, están utilizando curl que es la neta del planeta cuando se trata de transferir datos por medio de HTTP, en este caso los datos del voto.

Pero ejecutar el script manualmente para aumentar el número de votos por la flor #3 es muy tedioso, así que los emprendedores amigos de esta pobre flor decidieron llevarlo un paso más alla:

$nombres = file_get_contents(“nombres.txt”);
$correos = file_get_contents(“correos.txt”);
$nom = split(“\n”,$nombres);
$ema = split(“\n”,$correos);
$r = count($nom);

for($x=0;$x<$r;$x++){

if($ema[$x] && $nom[$x]){
xrun( $ema[$x], $nom[$x]);
}

}

Ahora basado en un archivo de nombres y correos, se van a enviar tantos votos como nombres existan en el archivo. Este pedazo de código se puede mejorar muchísimo, por ejemplo sólo enviar tantos votos como pares nombre – correo existan, en vez de basarse en el número de nombres. Otra posibilidad es enviar votos en un ciclo pero restringido en tiempo, es decir simular que ha pasado cierto tiempo entre voto y voto, para que no sea tan obvio que es un programa y no gente real la que está votando.

Y ya con eso la flor más bella del ejido es la #3, como podemos verla en la imagen tan contentota.

¿Y la cookie? Obviamente se la pasa por el arco del triunfo. El problema es que el programador supuso que los votos siempre vendrían del navegador, es decir confió de la entrada del usuario. ¿Y cual es la primera regla de la seguridad programación Web?

  1. Desconfía en la entrada del usuario.

Lo repetiremos de nuevo solo para asegurarnos de que quedó claro:

  1. Desconfía en la entrada del usuario.

Así es, desconfía de la entrada del usuario. Desconfía como desconfías del que te quiere vender un tiempo compartido, o del informe de gobierno.

¿Qué podemos hacer para evitarlo?
Lo más obvio es guardar la IP, pero eso deja por fuera a muchísimas personas que se conectan usando NAT. Me explico: en una casa puede que existan 3 personas que comparten una conexión a Internet. Estas tres personas quieren votar por la flor mas bella del ejido, pero la persona 1 ya se les adelantó y su IP fue guardado en el servidor del sitio por lo que al querer votar la persona 2 ya no puede, le aparece un mensaje que su voto ya fue registrado. La decisión de qué hacer dependerá de que tan flexible y seguro necesitamos que sea la encuesta.

Si se esta votando por la flor mas bella del ejido, probablemente sea suficiente con guardar la IP por 30 minutos o más y validar contra eso. Si se está votando por el presidente de un país, probablemente sea necesario un poco más de seguridad.

Programando para BlackBerry en OS X

Si quieres programar la siguiente killer application en BlackBerry, y eres usuario de OS X, tus opciones no son muchas. RIM ofrece un plugin beta para Eclipse en OS X, con la limitante de que no puedes usar simuladores para probar tu código. La única manera es utilizando un BlackBerry conectado por USB a la mac, y solo para aquellos con OS 6 (9800, 9670 y 9780)

Pero gracias a la virtualización, es posible ejecutar Eclipse y el plugin de BlackBerry para Windows que si tiene soporte para simuladores. En mi caso, no solo necesitaba programar bajo OS X sino también poder cambiarme entre OS X y Windows, dependiendo del lugar donde me encuentre. Para lograr el escenario anterior esto es lo que hice, en resumen:

  1. Instalar Windows virtualizado con VirtualBox en OS X
  2. Compartir la carpeta del workspace entre el Windows virtualizado y el host OS X
  3. Instalar Eclipse y el plugin de BlackBerry en Windows virtualizado
  4. Sincronizar la carpeta compartida con Dropbox
  5. Configurar Eclipse en la otra computadora (física) con Windows para que use el workspace sincronizado con Dropbox

Windows virtualizado
Esta es la parte fácil. VirtualBox es multiplataforma, open source, y muy sencillo de utilizar. Pueden encontrar el manual en línea aquí, pero no es necesario para instalar Windows virtualizado en OS X ya que VirtualBox es muy intuitivo.

Comaprtir la carpeta del workspace
Esto nos va a servir para dos cosas: que Dropbox pueda sincronizar la carpeta, y para compartir archivos entre Windows virtualizado y OS X. En la pantalla principal de VirtualBox damos click en Shared Folders, y configuramos el folder. En mi caso compartí el folder Public de mi /home como se indica en la siguiente imagen.

Shared Folders en VirtualBox

Al iniciar Windows virtualizado, este debe mostrar una unidad de red con el nombre del folder (Public en este caso). De no ser así, hay que asegurarse de que la opción de “Automount” se encuentre seleccionada al crear el folder compartido desde VirtualBox. Cualquier cosa que pongamos en el folder Public desde OS X, va a estar accesible para Windows virtualizado.

Eclipse y el plugin de BlackBerry en Windows virtualizado
Con el folder compartido podemos descargar desde OS X Eclipse (para Windows), el plugin para BlackBerry y tantos simuladores como necesitemos. Todos estos ejecutables los ponemos en el folder Public, vamos a Windows virtualizado y los instalamos como de costumbre en Windows.

Una vez con todo instalado, podemos ejecutar Eclipse y correr un proyecto de prueba solo para asegurarnos que efectivamente nuestra instalación funciona. En este punto podemos activar el modo Seamless de VirtualBox, para no tener todo el escritorio de Windows abierto, solo la ventana de Eclipse. Cuestión de preferencias.

Sincronizar la carpeta compartida con Dropbox
Si trabajáramos solo con OS X, hasta aquí ya podríamos crear y probar programas para BlackBerry. Pero en mi caso necesito poder moverme entre OS X y otra computadora con Windows, y tener el proyecto sincronizado en ambas. Para lograrlo hay que hacer dos cosas:

  1. Mover el workspace de Eclipse virtualizado al folder compartido
  2. Crear un link simbólico en OS X, para que Dropbox sincronice el folder

Vamos por partes, primero cerramos Eclipse, copiamos el folder del workspace de donde este actualmente a la carpeta compartida. Después reabrimos Eclipse y nos va a preguntar que si en donde está el workspace así que le indicamos el nuevo lugar y listo.

Ahora para que Dropbox sincronice ese folder aunque se encuentre fuera del folder de Dropbox, hay que hacer un link simbólico. Un link simbólico es como un atajo, un nombre que apunta hacia otra parte pero sin hacer una copia del contenido. Para eso tenemos que abrir la terminal, que en OS X podemos abrirla buscándo Terminal en spotlight. En la terminal tecleamos lo siguiente:

ln -s /Users/usuario/Public ~/Dropbox/destino/

De la línea anterior, reemplazar usuario por nuestro propio usuario, o la ruta completa si no usaron el folder Public. Lo importante es que la ruta NO DEBE terminar en / de lo contrario no funcionará. La segunda ruta es el folder de Dropbox donde queremos que se sincronice. El caracter ~ significa tu directorio home actual, y para ponerlo en el teclado de una mac es ALT + N.

En el folder de Dropbox debe aparecer el ícono del folder con una flecha negra, indicando que es un link como se muestra en la imagen.
Dropbox

Configurar Eclipse en la otra computadora (física) con Windows
Para esto basta con abrir Eclipse y seleccionar File | Switch Workspace, indicándole la ruta al workspace dentro del folder de Dropbox. En mi caso además de cambiar el workspace, tuve que importar el proyecto desde File | Import.

En este momento, cualquier cambio que hago en la computadora con Windows o OS X se sincroniza y puedo trabajar desde cualquiera sin problemas. Encima de todo esto uso git para llevar control de versiones, lo que funciona de maravilla.

Adiós Everlasting Flame

Cesar November 9th, 2010 aplicaciones, FLOSS, noticias, programacion 27 comentarios

Everlasting Flame icon

Hace aproximadamente 2 años (el 1ro de Diciembre se cumplen) inicié un proyecto, como empiezan la mayoría de estos: para rascar una comezón propia. A lo largo de los meses se fue desarrollando, hasta que se convirtió en algo útil no solamente para mi, sino para muchas otras personas en mi misma situación.

Se creó un sitio para que la gente pudiera descargarlo, probarlo, donar al proyecto pero más importante, contribuír. Como en cualquier proyecto Open Source, las contribuciones pueden ser de muchos tipos, no solamente en código. Con Everlasting Flame, recibí contribuciones muy importantes:

  1. La página fue hecha por mi compañero Geek&Roller Rafyta, además de estar hosteada en sus servidores
  2. Ideas de nueva funcionalidad
  3. Numerosas contribuciones monetarias por medio de paypal y depósitos directos

Pero llegó el momento de decir adiós.

¿Porque?
La razón principal es que ya no tengo el tiempo necesario para continuarlo como hobbie. No hay nadie que tome la batuta, nunca llegó otro programador a querer contribuir con el desarrollo. Un tiempo comencé a darle vueltas a la idea de cobrar por distribuir los binarios, o ponerlo en el App World de paga, pero en ese entonces no se podían comprar aplicaciones en la App World desde México. Finalmente llegó la empresa Innox y me compró el proyecto, asegurando su desarrollo futuro.

¿Qué va a pasar con Everlasting Flame?
Será responsabilidad de Innox continuar con su desarrollo, pero se vuelve closed source. Como parte del acuerdo yo dejo de distribuír los binarios desde mi sitio.

¿Y la tan prometida versión 2.0?
Toda la funcionalidad de esta versión estará presente en la primera que se libere por parte de Innox.

¡Cerdo capitalista!
Hay que comer pues…

Iconos de Eclipse y Netbeans para Docky

Netbeans

Ya que andamos en eso de hacer que Eclipse se vea bien en GNU/Linux, ahora le toca el turno a los iconos tanto de Eclipse como de Netbeans.

Normalmente tengo los dos IDEs instalados, y sus iconos de aplicación se ven pésimo a resoluciones altas como las que maneja Docky. Afortunadamente la solución es simple, reemplazarlos por unos de mayor resolución.

Para Eclipse, hay un excelente icono en formato SVG que sigue las especificaciones del proyecto Tango. Este icono lo encuentran en Gnome-Look.org.

Para Netbeans es más interesante, se puede usar el mismo icono que se usa en OSX. Resulta que cuando instalas Netbeans en OSX el icono se ve muy bien, pero usuarios de otros sistemas operativos nos tenemos que conformar con una versión de menor resolución. Afortunadamente podemos tomar el icono de OSX en formato icns y usar icns2png (disponible en tu distro favorita) para convertirlo a PNG. Ahora que si se quieren ahorrar esos pasos, solo click derecho y guardar como. Gracias este blog por el tip.

Cómo hacer que Eclipse se vea más bonito en Ubuntu

Tradicionalmente Ubuntu no le ha dado la prioridad que debería a eclipse, mi IDE de preferencia a la hora de programar. La diferencia es más notable si, como yo, constantemente te encuentras cambiando entre sistemas operativos.

Eclipse IDE en Windows 7
eclipse_windows

Eclipse IDE en Ubuntu
eclipse_ubuntuhuge

Notese como en Ubunto en el mismo espacio se muestra mucho menos área útil, ya que los botones y la interfaz en general ocupan más espacio del que deberían. El problema real está en GTK y sus limitantes, no en eclipse o SWT (el toolkit gráfico utilizado por eclipse). Para arreglarlo, al lanzar eclipse es posible especificarle a gnome que use un tema diferente, modificado especialmente para que eclipse use mejor el espacio disponible.

Lo primero es asegurarnos que las fuentes liberation-fonts se encuentran instaladas (en mi caso ya estaban instaladas):

sudo aptitude install ttf-liberation

Después descargamos este zip y lo descomprimimos en el directorio raíz donde se encuentra eclipse. El zip contiene dos archivos:

  • gtkrc-sar es el archivo de propiedades para el tema de GTK que vamos a utilizar específicamente con eclipse.
  • ec es un shell script muy sencillo que se encarga de crear la variable de entorno para el tema de eclipse y finalmente lanzarlo

Ahora hacemos el shell script ejecutable:

chmod 755 ec

Y finalmente ejecutamos ec en vez de eclipse:

./ec

Eclipse en Ubuntu después de las modificaciones
eclipse_ubuntubetter

El resultado es un eclipse con un espacios mucho más normales en las tabs y los iconos de la barra de herramientas, aprovechando mejor el espacio y mejorando la experiencia de usar este IDE en Ubuntu.

Si se quiere modificar la entrada del menú para lanzar eclipse, lo cual a su vez tiene el efecto de permitirnos de lanzar eclipse con el nuevo tema desde Gnome Do, o Docky por ejemplo, lo que se tiene hacer es editar el script ec y dejarlo de la siguiente manera:

#!/bin/sh
GTK2_RC_FILES=/home/usuario/eclipse/gtkrc-sar /home/usuario/eclipse/eclipse

Lo que estamos haciendo es utilizar rutas absolutas en vez de relativas. En este caso estoy suponiendo que eclipse se encuentra instalado en /home/usuario/eclipse/ hay que editar el archivo para que concuerde con el sistema de cada quien.

Con esta modificación al script, en el menú principal podemos agregar una entrada para eclipse (si no es que ya tenemos una) poniendo como comando lo siguiente:

sh /home/usuario/eclipse/ec

Ahora sí, tanto Gnome Do como un lanzador de Docky creado a partir del menú principal deberán de iniciar eclipse con el nuevo tema.

Gracias a Sarath Chandra por el post original.

Cargando recursos binarios desde JavaScript

Desde que Google mostró al mundo su port de Quake 2 a JavaScript usando GWT, no me podía sacar una pregunta de la cabeza: ¿Cómo hacen para cargar los recursos (como por ejemplo los modelos de los jugadores, o los niveles) desde el servidor al cliente, para su uso por el motor del juego en JavaScrip? ¿Es posible obtener archivos binarios del servidor, guardarlos en el sistema de archivos local, y ejecutarlos finalmente por una aplicación en JavaScript? La respuesta obviamente era sí, pero no sabía cómo.

Pero una consulta al código fuente del proyecto quake2-gwt aclaró las dudas. El secreto es sobreescribir un tipo MIME, lo que le permite al objeto XMLHttpRequest recibir respuestas binarias en vez de texto, para lo cual es más comúnmente utilizado.

function load_binary_resource(url) {
  var req = new XMLHttpRequest();
  req.open('GET', url, false);
  //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
  req.overrideMimeType('text/plain; charset=x-user-defined');
  req.send(null);
  if (req.status != 200) return '';
  return req.responseText;
}

En GWT necesitamos hacer uso de una funcion JavaScript nativa (JSNI) para lograr lo mismo:

private native void overrideMimeType(XMLHttpRequest req, String mimeType) /*-{
    req.overrideMimeType(mimeType);
}-*/;

Y finalmente crear un objeto XMLHttpRequest, hacer la petición y procesar los datos binarios en el cliente:

XMLHttpRequest req = XMLHttpRequest.create();
overrideMimeType(req, "text/plain; charset=x-user-defined");

req.setOnReadyStateChange(new ReadyStateChangeHandler(){
    //procesar la respuesta binaria
});
		
req.open("GET", "archivo.binario");
req.send();

Para convertir la respuesta en un InputStream, en este caso utilizando GWT y clases de emulación io y nio que tomé prestadas del proyecto quake2-gwt:

response = xhr.getResponseText();
byte[] responseBytes = new byte[sbb.stringToByteBuffer(response).remaining()];
InputStream inputStream = new ByteArrayInputStream(responseBytes);

En este punto pueden usar el InputStream como lo harían en un programa Java tradicional, por ejemplo si cargaron los bytes de una imagen, pueden aplicarle filtros a-la-photoshop, en tiempo real, en el cliente, sin necesidad de procesamiento en el servidor mas allá de descargar la imagen.

El CPU del Nintendo Entertainment System

Soy un geek de la emulación desde que supe se podía emular el SNES en mi modesta Pentium 2. Desde entonces he utilizado varios emuladores y hasta programado un simulador por mi cuenta (para el microcontrolador 68HC11 de Motorola).

Lo que me lleva a este post: el NES. El NES es interesante ya que es el sistema más emulado que hay, aún así crear un emulador del NES no es tarea fácil. Además las computadoras (y otros gadgets) de hoy tienen lo suficiente para emularlo sin penalización en la velocidad. También, su CPU (MOS 6502 ligeramente modificado) de 8 bits fue el CPU elegido para la mítica Commodore 64, el Atari 2600, Terminator y Bender. Leer el resto de este post.

Cuando Hibernate cascade te juega bromas

Cesar March 23rd, 2010 programacion 7 comentarios

Ah, Hibernate. ¿Que podemos decir? Te atrae con promesas de cerrar la brecha entre lo relacional y el mundo de los objetos, pero luego te deja a que trates de entender por qué demonios no funciona como tu lo esperas. En cierto modo es como C++ que evita que te dispares en el pie, pero cuando lo haces te vuelas la pierna completa.

De lo que quiero hablar en este post es de las operaciones en cascada. Hibernate te permite configurar operaciones en cascada, de tal manera que si así tu lo deseas, cuando creas un objeto que a su vez tiene relación con otro objeto, ambos pueden ser guardados con una sola operación. Por ejemplo:

public class Member(){
    private ExpertiseArea expertiseArea;
}

En este caso, Member tiene una relación uno a uno con ExpertiseArea, y sería deseable que al guardar Member también se guardara ExpertiseArea. Para lograrlo, le decimos a Hibernate cuando debe realizar las operaciones en cascada:

<one-to-one name="expertiseArea" 
    class="ExpertiseArea" 
    cascade="persist,save-update" />

Con lo anterior le decimos a Hibernate “Cuando ejecutes las operaciones de crear (persist) y de actualizar (save-update) en Member, también hazlo para ExpertiseArea”.

Creamos una prueba para verificar que lo anterior funciona como debería:

	@Test
	public void testMemberRetrieval(){
		Member m = buildMember();
		md.makePersistent(m);
		md.flush();
		
		Member retrievedMember = md.findById(m.getId(), false);
		assertNotNull("Entity should not be null",retrievedMember);
		Member retrievedMember = md.findById(m.getId(), true);
		assertNotNull("Entity should not be null",retrievedMember);
		assertNotNull("ExpertiseArea should be persistent", 
                    retrievedMember.getExpertiseArea());
	}
	
	private Member buildMember(){
		ExpertiseArea ea = new ExpertiseArea("Singer");
		Member m = new Member("Britney Spears", ea, "Queen of Pop");
		return m;
	}

¿Qué estamos haciendo aquí? Creamos un nuevo Member, le asignamos un ExpertiseArea, y lo guardamos todo en una sola instrucción makePersistent. Como tenemos configuradas las operaciones en cascada, esperamos que se guarden en la base de datos tanto la instancia de Member, como la de ExpertiseArea. Efectivamente, la prueba pasa y podemos revisar en los logs lo que Hibernate hace tras bambalinas:

Hibernate: insert into Member (VERSION, name, tagLine, id) values (?, ?, ?, ?)
Hibernate: insert into ExpertiseArea (VERSION, name, id) values (?, ?, ?)

Pass

No esperaba menos. Leer el resto de este post.

Posts anteriores