NHibernate Validator 1.2 Beta3 liberado
NHibernate Validator 1.2 Beta2 liberado

Descarga NHibernate Validator 1.2 beta2 con fuentes, binarios y ejemplos aquí.
Listo para usarse con NHibernate 2.1 GA.
A disfrutarlo
Bug con SCOPE_IDENTITY() en Sql Server 2005/2008
Bueno, la historia es ya conocida, cuando trabajamos con NHibernate no es conveniente usar identity, hay cosas de NHibernate que no se aprovechan. Cuando se usa Identity y se realiza un Save(), NHibernate tiene que forzar el INSERT para obtener el Id, por lo tanto el concepto de Unidad de trabajo no es explotado.
Ahora sumémosle este bug, que la gente del SQL Server team después de evaluar dice: ?Desafortunadamente, después de evaluar las opciones para solucionar el problema, llegamos a la conclusión que no podemos arreglarlo para Sql Server 2008?
Conclusión
Si usas NHibernate+SQL Server, no te aconsejo identity como generador de identificadores en producción. Una muy buena opción que tiene muchas bondades es usar como generador a hilo.
Ms Sql Server y caraterísticas molestas en un multi-RDBMS framework
Estos días fueron de análisis acerca de las caráterísticas de SQL Server, en especial las versiones 2005 y 2008, que sí molestan cuando se habla de un framework que genera código hacia múltiples motores relacionales, el actual framework en cuestión NHibernate, otros, pueden unirse a la queja.
Siempre en el núcleo de NHibernate hay que aplicar parches para las propias características de los motores relacionales que soporta, lo cual es muy entendible, cada motor tiene derecho a implementar como cree que es mejor sus características. Muchos de esos cambios desembocan en el dialecto, otros en el parser, otros en la parametrización o preparación de los commandos a ejecutar (lease IDbCommand) y otros vaya uno a saber.
Algunas características que implicaron cambios a pedido de los usuarios, tanto en dialecto como en parsers son entre otros: la paginación! Esta característica de SQL Server dio qué hablar, y mucho dolor de cabeza.
Cómo algo tan básico, que se usa día a día en las aplicaciones que desarrollamos, y hasta pareciera inofensivo, terminó desembocando en TODO un cambio en el dialecto de MsSql2005 (dentro de NHibernate por supuesto).
Qué hicimos los usuarios de Sql Server 2005/2008 para recibir semejante fea característica de paginación? Quizás no haya ejemplos de otros de otros RDBMS con paginación?, quizás no fuimos tan devotos del producto? Vaya uno a saber. Pero ejemplos de paginación en otros RDBMS. Este Sr. Postgres hace una linda paginación con la clausula LIMIT, donde se declara el límite y el offset. Fácil no? Resumiendo, esta característica se salvó aplicando un parche grande al dialecto gracias a contribuidores.
Compliquémosle un poco cuando usamos Sql Server 2005/2008 con las clausulas de FullText Search nativas: Contains y FreeText. Ambas clausulas hasta parecen mágicas por que son ?void?, no devuelven ningún valor, y esto significó otro parche en el Parser de NHibernate, uno chico, pero modificamos el Parser (no el Dialecto del motor específico), lo cual lo hace un poquito más molesto, porque? Por que el dialect es una de las cosas más recomendadas a inyectar cuando se trata de características que faltan. Para ver cómo terminaron las cosas, ir a este post.
Ahora vayamos a Queries Parametrizadas + Planes de ejecución. Bueno, todos saben es extremadamente bueno que el RDBMS cachee los planes de ejecución de las consultas para poder usarlas más tarde, ganando en performance. Incluso muchos usan SP por que dicen que NHibernate: ?genera consultas dinámicas que desembocan en el recalculo del plan de ejecución de cada consulta?. Esto es FALSO. NHibernate genera consultas, pero son todas parametrizadas, por lo tanto son reusables para no volver a calcular los planes de ejecución. Inclusive NHibernate se vale de opciones como: ?prepare_sql?, que sirve para activar el comando Prepare() en el IDbCommand. El punto es el siguiente, ahora Sql Server 2008 lanzó otra característica que le agrega otro pedazo de código a nuestras consultas SQL: OPTIMIZE FOR UNKNOWN. Podemos tomar un pequeño paseo por esta característica leyendo este post. La característica me parece bárbara, pero, otro pedazo más de SQL para eso?
No quiero saber a donde vamos a parar de acá a 10 años: O se empiezan a hacer más transparentes algunas opciones importantes, o cuando tenemos algún framework que genera código SQL para nuestro motor SQL Server vamos a necesitar impresiones en algo más que formato A4 para leer.
Quizás, quien dice, haga falta una re-estandarización del lenguaje SQL, por que nos estamos pasando con ?nuestras? propias implementaciones, y ese tipo de cosas perjudican a las herramientas (frameworks) que trabajan sobre estos motores para hacer las cosas más fáciles a los desarrolladores.
Future<T> Queries con HQL y Criteria
Hace unos días atrás habilité una caraterística nueva en NHibernate para Hql (que previamente habia sido implementada para Criteria). La caraterística se llama Future y no va a ayudar a prevenir hits innecesarios al motor de base de datos. Felizmente va a estar disponible en la version 2.1, que se liberará una alpha en marzo.
Leer artículo.
NHibernate no está integrado con el compilador, y qué ?
Bueno, sé que el titulo suena como “eh !?”, pero dejenme explicarlo un poco más en detalle.
NHibernate es una framework que usa Xml nativamente para configurar los mapeos entre objetos y tablas, que está encargado de juntar estos 2 mundos diferentes.
Ahora, qué tiene de malo esto? Mucha gente puede decir que los archivos Xml son malos, por que después de escribir muchas líneas, intentamos compilar nuestro proyecto, y el compilador de nuestro lenguaje host no sabe si el Xml está bien o no, no nos informa con ningún error. Esto es verdad, se debería correr el proyecto y ver que acontece en tiempo de ejecución, y obtener un error en runtime es simplemente molesto.
Pero bien, tenemos otra alternativa a esto? La respuesta es sí. Vayamos a los detalles. NHibernate tiene también un “compilador”, y si todavía no te lo imaginaste, es el método BuildSessionFactory(). No es necesario lanzar toda la aplicación para saber si nuestros mappings están bien o mal. Una manera de saber si todo está bien es crear un metodo de Test como este:

Luego solamente queda compilar nuestro proyecto, y correr este simple y tonto test. Si nuestro código pasa esta prueba, tus mapeos están bien.
Debemos recordar una cosa, se puede mapear no solamente entidades en los Xml, también se pueden mapear Queries (y otras cosas que no son relevantes en este post). El mapear queries en Xml se llama: Named Queries, y en este post hablamos un poco más de sus bondades. Pero el punto principal aquí es, que mapeando las queries sabrás si están bien formadas o no cuando el método BuildSessionFactory() es disparado (se hacen otras cosas aparte de compilar las queries, se discuten en ese post).
Otra cosa que DEBES recordar es usar Xsd para validar los mappings files. Esto es obligatorio si estás usando NHibernate y quieres pasar el tiempo programando en vez de luchando con errores de mapeo (aquí los errores pueden ser inclusive de Xmls mal formados, donde esto es más grave). Pero esto es tema para otro post.
nhforge.org listo !
Bueno, esto es lo que venimos buscando hace un tiempo con la comunidad de NHibernate y lo estamos logrando. Este fin de semana, después de un largo proceso de configuración pudimos dejarlo funcional.
www.nhforge.org
La explicación de qué es NHForge está muy bien explicado en el “welcome”, creo que sobran más que esas palabras.
Hay algo que si les interesa NHibernate DEBEN hacer: es suscribirse a el feed del blog de NHibernate.
Cuanto se ha cambiado NHibernate desde 1.2.1 hasta 2.0 GA?
Patrick Smacchia me envia este link donde analiza NHibernate con NDepend.
Quiero que aprecien el análisis que realizó con esta herramienta, donde el que considero más importante son el análisis de los cambios realizados. En el enlace vean el gráfico con las zonas pintadas de azul, y van a ver cuantos cambios se hicieron
NHibernate 2.0: Changes Overview
NHibernate Validator 1.0 CR1
Espero que disfruten the esa nueva release de este increible framework de validación. Incluimos en esta release más estabilidad, más documentación, ejemplos y el punto más importante es la completa compatibilidad con NHibernate 2.0 GA.
Como siempre los issues deben reportarse aquí:our issue-tracker.