miércoles, 31 de diciembre de 2008

Comparativa PS3 vs Xbox 360 vs Wii

Comparativa PS3 vs Xbox 360 vs Wii
Especial Comparativa PS3 vs Xbox 360 vs Wii

Comparativa PS3 vs Xbox 360 vs Wii
>> Manuel Sagra | 30/06/2007 13:19:09

Ahora que se empiezan a asentar las tres consolas de sobremesa que nos van a acompañar durante unos años, va siendo hora de repasar los defectos y las virtudes de todas ellas, para ver cuál se adapta mejor a nuestros gustos. En cualquier caso este tema es bastante subjetivo y no está exento de polémica, así que intentaremos ser justos e imparciales dentro de lo posible.

PS3, Wii y Xbox 360
El cerebro de la bestia

Si nos centramos en "las tripas" de las consolas (procesadores, memoria,...), está claro que hay dos apuestas claramente diferenciadas en esta generación: la potencia bruta (Xbox 360 y Playstation 3), y al aprovechamiento de tecnologías asentadas (Wii). Veamos cada una de ellas con más detalle.

Playstation 3 es una máquina realmente sorprendente, con el ya famoso procesador Cell a 3.2 GHz: formado por un núcleo central (PPE) basado en PowerPC, y otros seis núcleos llamados SPEs con arquitectura RISC. La memoria principal es de 256 MB, a la que hay sumar la memoria de vídeo -otras 256 MB- que dispone la GPU, basada en el chipset NVIDIA G70 con un reloj a 500 MHz. Aunque todo esto da una capacidad teórica de 2.18 TeraFLOPS, la consola es bastante nueva y compleja de programar -como ya pasó en su día con la Saturn-, y todavía tardaremos en ver juegos que aprovechen su verdadero potencial.

La Xbox 360 no se queda muy atrás en el apartado técnico, ya que cuenta con la CPU "Xenon" también a 3.2 GHz, compuesta de tres núcleos PowerPC. La memoria es de 512 MB; y está compartida con la GPU -similar al de la tarjeta ATI Radeon 600-, que también corre a 500 MHz como en el caso de la Playstation 3. Esta arquitectura está realmente bien diseñada -aunque sólo llegue a 1 TeraFLOP-, y muchos desarrolladores se sienten más cómodos programando para esta consola... aunque también es cierto que los kits de desarrollo están muy maduros, y Microsoft es una empresa que tiene mucha experiencia en el mundo del software.

Las tripas de la 360

Por otra parte, la Wii tiene unas cifras mucho más modestas. La CPU, con el nombre en código de Broadway, no es más que un chip de un sólo núcleo basado en PowerPC -supuestamente a 729MHz-, y la GPU -diseñada por ATI y llamada Hollywood-, corre a 243 MHz. La memoria principal es de 64 MB, a lo que hay que sumar otras 24 MB -para asegurar la compatibilidad con Gamecube- y unos humildes 3 MB auxiliares para guardar texturas. Está claro que la potencia bruta no es la mayor virtud de la Wii, y de hecho Nintendo nunca habla de los datos técnicos cuando presenta su consola. Aún así, es una máquina que todavía no se ha explotado correctamente, ya que los desarrolladores están demasiado cómodos programando como si fuese una Gamecube ligeramente potenciada, y es de esperar que los títulos de segunda generación demuestren el verdadero potencial de la consola.
Leyendo y guardando información

Mientras que Wii y Xbox 360 tienen una unidad de DVD capaz de leer discos de doble capa, en Sony han apostado por el Blu-Ray -con una capacidad hasta seis veces mayor- para su consola Playstation 3. Esta decisión ha hecho que el precio de esta última máquina se eleve considerablemente, pero a cambio se dispone de serie de un soporte que es uno de los abanderados de la alta definición.

HD-DVD y Blu-ray

La Xbox 360 lee DVD-Video sin necesidad de un accesorio extra, y existe una unidad de HD-DVD opcional que permite la reproducción de películas en este formato. Por otra parte, la Wii no puede usarse actualmente para ver nuestros DVDs, aunque en Nintendo han anunciado un modelo que tendrá esta característica gracias a un software adicional.

Por otro lado, las unidades de Playstation 3 y Wii son slot-in y no emiten demasiado ruido durante la lectura, mientras que en Xbox 360 el lector es de bandeja, y por alguna razón es uno de los factores principales del "particular" ruido que genera la consola durante su funcionamiento.

La Playstation 3 es la única que incorpora un disco duro por defecto, mientras que en Xbox 360 es opcional. En la Wii se ofrecen 512 MB de almacenamiento interno -en una memoria Flash- para guardar partidas y otros archivos, y también tiene un lector de tarjetas SD en las que se pueden copiar partidas y canales. Estas tarjetas también se pueden utilizar en la Playstation 3, así como Compact Flash y Memory Stick.

En la Xbox 360 también existe la posibilidad de usar tarjetas de memoria propietarias de hasta 512 MB para guardar partidas y juegos del Bazar. Hay que destacar que son diferentes de las utilizadas en la primera consola de Microsoft, haciendo complicado el utilizar partidas de la Xbox si no se utilizan productos third-party, como por ejemplo los fabricados por Datel. En Wii este problema está resuelto gracias a un par de bahías para las tarjetas de la Gamecube, y en Playstation 3 se vende un adaptador USB para conectar tarjetas de Playstation y Playstation 2.
Espectáculo audiovisual

Tanto Xbox 360 como Playstation 3 son capaces de llegar a resoluciones de hasta 1080p, mientras que los usuarios de Wii se tienen que conformar con 480p en sus televisiones de alta definición. Nintendo no ha apostado por una calidad visual "revolucionaria" con su consola, a cambio de una experiencia de juego diferente.

Alta Definición

Para poder conectar las consolas a nuestros televisores (y monitores), disponen de las siguientes salidas:

* Playstation 3: HDMI (o DVI con el adaptador correspondiente), Componentes, RGB, S-Video, AV.
* Xbox 360: HDMI (en el modelo "Elite" que todavía no ha llegado a Europa), VGA, Componentes, RGB, S-Video, AV.
* Wii: Componentes, RGB (consolas PAL), S-Video (consolas NTSC), AV

Se echa de menos la salida VGA de serie en Playstation 3 y Wii, y hay que destacar que el puerto HDMI que traerá Xbox 360 Elite es 1.2, por lo que no se puede disfrutar de Dolby TrueHD ni de DTS-HD Master Audio, unos formatos que sí están presentes en Playstation 3.

Hablando de formatos de audio, a parte de los mencionados, Xbox 360 y Playstation 3 soportan Dolby Digital (7.1 en caso de la consola de Sony) a través de una salida óptica, mientras que en Wii sólo hay Dolby Pro Logic II mediante la salida stereo por RCA.
Comunicaciones

Las tres consolas tienen puertos USB 2.0 (Wii tiene dos, Xbox 360 tiene tres y Playstation 3 cuatro), que pueden servirnos para cargar el móvil o conectar diversos periféricos. Las dos últimas también pueden reproducir música, fotos y vídeos en dispositivos compatibles conectados, mientras que en Wii esta característica sólo está disponible si usamos tarjetas SD, quedando la música en MP3 reservada a ciertos juegos como "Excite Truck".

Dispositivos USB

Además, Playstation 3 y Xbox 360 pueden reproducir ficheros multimedia por streaming con los últimos firmwares, lo que las convierte en unos aparatos realmente atractivos para tener junto a nuestro televisor.

Por otra parte, tanto Playstation 3 como Wii soportan Bluetooth, y en la primera, además de para los mandos, se puede utilizar para conectar dispositivos como teclados, ratones, auriculares inalámbricos o el control remoto para las películas en Blu-Ray.

Las tres se pueden conectar a Internet por Wi-Fi o por cable, teniendo que pagar un extra en el caso de Wii (adaptador Ethernet) y Xbox 360 (adaptador Wi-Fi). En todos los casos, la conexión es bastante sencilla y compatible con la mayoría de los routers del mercado.

PSP y Nintendo DS tienen una conectividad especial en sus consolas de sobremesa respectivas, aunque en el caso de segunda todavía está por ver hasta dónde se puede llegar. Las consolas de Sony están bastante bien integradas, ya que la PSP se puede utilizar como control remoto, puede utilizar juegos de Playstation bajados de la Store e incluso sirve como espejo retrovisor en algunos juegos de coches.
Controlando la situación

Esta generación también se ha desmarcado por los mandos de control. La consola más innovadora en este sentido es la Wii, que por una parte se aleja del modelo de pad convencional y por otra vuelve de alguna manera a los orígenes con un diseño similar al que introdujo con la Famicom hace más de veinte años. Este mando inalámbrico sirve como puntero gracias a unos sensores de infrarrojos que se colocan en el televisor, y envía por Bluetooth la información de su movimiento a la consola. Por si fuese poco, incorpora vibración, un pequeño altavoz que reproduce sonidos del juego, y permite conectar accesorios por cable como el nunchako -un control analógico con un par de botones y detección de movimiento- o el mando clásico, ideal para los juegos de la Consola Virtual. También existe la posibilidad de utilizar hasta cuatro pads de Gamecube, para jugar en determinados juegos de Wii o en los juegos de la anterior consola de Nintendo.

Wii Remote

Por otra parte, Playstation 3 tiene un pad llamado SixAxis, que de manera similar al de Wii también puede detectar los movimientos en tres dimensiones. El mando es muy parecido al de las consolas anteriores, aunque ha perdido la función de vibración, haciendo que sea bastante ligero. También es inalámbrico, y a diferencia del de la consola de Nintendo se alimenta gracias a una batería interna, que se puede recargar con un cable USB que viene incluído con la consola. También podemos conectar mandos de otras Playstation si contamos con el adaptador USB correspondiente.

SixAxis

Por último, Xbox 360 tiene dos tipos de pads a la venta, y también dependen del modelo de la consola que compremos. El modelo Core trae un pad con cable de toda la vida, mientras que el modelo Premium incorpora uno que funciona de manera inalámbrica. El diseño es similar al de la Xbox original, aunque bastante más estilizado y ergonómico. El modelo inalámbrico puede alimentarse con pilas o con una batería, que se recarga con mediante un cable conectado a la consola.

Pad de la 360

Es de agradecer que en esta generación todas las consolas tengan la posibilidad de conectar varios mandos para juegos multijugador. En concreto la Wii y la Xbox 360 soportan hasta cuatro, y la Playstation 3 hasta siete... curiosa cifra, por otra parte.
Servicios on-line

Las tres compañías han apostado por la conexión a Internet y el juego en línea. Sin embargo, hay que admitir que el servicio de Xbox Live! es el más completo de todos, aunque jugar on-line no sea gratis. En cualquier caso, veamos lo que ofrece cada uno de ellos.

Microsoft apostó desde un principio por el Live!, y si ya era bueno en la primera Xbox, en su última consola lo han mejorado aún más. Por una parte podemos recibir actualizaciones de sistema, incluyendo mejoras en la retrocompatibilidad. Por otra parte, en el Bazar podemos descargar demos, trailers -tanto de juegos como de películas-, contenido extra, y juegos de Live Arcade!. Recientemente también se ha añadido la posibilidad de chatear con Messenger -accesorio de teclado incluído-, y en un futuro está previsto que se descarguen películas y series, y se pueda disfrutar de Televisión por IP. Todo esto se puede hacer con una cuenta gratuita "Silver", pero si queremos jugar on-line, debemos abonar periódicamente una cantidad para tener el servicio "Gold". Hay que destacar que esto no incluye cuotas extras derivadas de juegos tipo multijugador masivo.

Por otra parte, Sony ha creado la Playstation Network, con una tienda virtual de la que también podemos descargar demos, extras, trailers y juegos, incluyendo algunos títulos de la Playstation original. El servicio es gratuito, incluyendo la posibilidad de jugar on-line con algunos juegos. Actualmente la oferta de juegos que permitan esta posibilidad es baja, y de hecho algunos multiplataforma como "Virtua Tennis 3" sólo se pueden jugar vía Internet en Xbox 360, pero es de esperar que esta situación mejore con el tiempo. También es posible navegar por Internet con un navegador desarrollado por NetFront, aunque el soporte de Javascript y plugins es limitado. Por otra parte, no se puede negar que el panorama de los servicios on-line en esta consola es realmente prometedor, con el "Playstation Home" por bandera, el interesante juego co-operativo "Little Big Planet" o la tienda de canciones del próximo "Singstar".

Playstation Home

Wii tiene varios servicios on-line, además de una tienda en la que se pueden descargar algunas aplicaciones y juegos de consolas pasadas -tanto de Nintendo como de SEGA y otras compañías-, en la denominada "Consola Virtual". Actualmente, los canales que utilizan Internet son: el Navegador Web Opera -con Flash y buen soporte de Javascript-, el canal de Noticias, el canal del Tiempo y el canal de Opiniones. La verdad es que la oferta es bastante original, y es bastante probable que Nintendo nos sorprenda en breve con nuevos servicios.

La forma de pago para los contenidos no gratuitos es distinta según la consola. Tanto en Xbox 360 como en Wii se utiliza un sistema basado en puntos, que pueden comprarse on-line con una tarjeta de crédito o bien mediante tarjetas prepago en diversos puntos de venta. Por otra parte, en Playstation 3 las transacciones se hacen directamente con dinero real en la moneda local de cada región, lo que en un principio es más equitativo, ya que la compra de puntos tiene distinto precio en cada país.
Retrocompatibilidad

Las tres consolas permiten jugar con juegos de la anterior generación, aunque cada una de forma diferente.

La Wii es la más completa en este sentido, ya que la compatibilidad es total debido a que tiene una arquitectura interna similar a Gamecube y permite conectar los mandos y tarjetas de memoria de esta última consola. Por otra parte, también podemos jugar por emulación con títulos de Nintendo 64, Super Nintendo y NES gracias a la Consola Virtual, aunque tendremos que pagar de nuevo por ellos aunque tengamos el original.

Virtual Console

En el caso de Playstation 3 se ofrece una compatibilidad parcial con juegos de Playstation y Playstation 2, aunque la lista va aumentando a medida que van sacando firmware nuevos. Para alegría y disfrute de muchos, con la última actualización se puede jugar en alta resolución a los juegos de anteriores generaciones. Si ya tenemos mandos y accesorios de consolas anteriores, podemos conectarlos gracias a unos adaptadores USB que se venden aparte.

Por último, en Xbox 360 necesitamos de disco duro para poder jugar a los juegos de su hermana mayor. Al igual que en la consola de Sony, la lista de compatibilidad va mejorando poco a poco, aunque Microsoft ha afirmado en alguna ocasión que este tema no era especialmente prioritario para ellos.
Lo más importante: los juegos

Todo lo dicho anteriormente serviría de muy poco si las consolas no estuviesen apoyadas por las compañías productoras de videojuegos. Afortunadamente para todos, las tres consolas tienen una buena oferta, y además se vislumbran títulos realmente prometedores en todos los sentidos. Veamos que nos ofrece cada una de ellas.

Xbox 360 cuenta con la ventaja de haber salido con varios meses de adelanto, lo que hace que cuente con un catálogo realmente consolidado, con títulos que pasarán a la historia como "Dead Rising", "Lost Planet", "Gears of War", o el reciente "Forza Motorsport 2". Además, el catálogo del Bazar es realmente bueno, con joyas como "Castlevania: Simphony of the Night", "Lumines Live!" o "Geometry Wars". Si a esto le sumamos la potente infraestructura on-line y la posibilidad de probar una gran cantidad de juegos gracias a las demos, se convierte en una apuesta segura.

Gears of War

Wii ha sido la segunda en salir, y hay que admitir que la mayoría de los pesos pesados de la consola han salido en los dos primeros meses. "Wii Sports", que viene incluído con la consola, es realmente divertido para jugar con amigos o en familia y para hacerse con el peculiar mando, "The Legend of Zelda: Twilight Princess" es una aventura que realmente merece la pena disfrutar y existen otros títulos como "Excite Truck" o "Mario Strikers: Charged Football" que deben estar en nuestro punto de mira. También hay que tener en cuenta la Consola Virtual, en la que se puede jugar a títulos "Super Mario 64", "Super Castlevania IV" o "The Legend of Zelda: Ocarina of Time" por un módico precio.

El catálogo de Playstation 3 no es demasiado amplio, aunque hay juegos como "Virtua Fighter 5", "Motorstorm" o "Resistance" que son bastante buenos para ser de "primera hornada". Además, podemos descargar juegos tan curiosos como "flOw" o tan completos como "Tekken 5: Dark Resurrection", sin olvidarnos de demos con una calidad tan sorprendente como "Gran Turismo HD". La verdad es que se nota que esta consola es la más joven, y todavía quedan unos meses para que vengan títulos que demuestren su verdadero potencial.

En este sentido el panorama no puede ser mejor, ya que va quedando menos para disfrutar de títulos como "GTA IV", "Devil May Cry 4" o "Assassin´s Creed" -por poner unos ejemplos- tanto en Xbox 360 como en Playstation 3. La consola de Microsoft también tiene unas exclusivas muy apetecibles, como "Halo 3", "Bioshock" o "Fable 2", mientras que los usuarios de Playstation 3 disfrutarán en exclusiva de "Heavenly Sword", "Metal Gear Solid 4" -aunque cada vez más voces apuntan que aparecerá también en Xbox 360- o del prometedor "Uncharted: Drake´s Fortune". Wii tampoco se queda atrás, con juegos tan esperados como "Metroid Prime 3: Corruption", "Super Smash Bros. Brawl" o "Super Mario Galaxy".

Super Mario Galaxy
¿Te has decidido ya?

Es realmente complicado hablar de todo lo que pueden ofrecer las consolas actuales, ya que han dejado de ser unos sistemas que a lo sumo ofrecían la reproducción de CDs musicales para convertirse en unos aparatos realmente versátiles y completos. Por si fuese poco, la Playstation 3 también pueden convertirse en un ordenador personal -con ciertos límites- al permitir la instalación del sistema operativo GNU/Linux.

Aunque la decisión debería fundamentarse en el catálogo de cada consola, es difícil dejar de lado estas otras prestaciones, y deberían tenerse en cuenta a la hora de elegir el sistema que nos acompañará durante los próximos años. Por ejemplo, si queremos estar preparados para el vídeo doméstico de alta definición -una batalla que se libra actualmente entre los formatos Blu-ray y HD-DVD-, las consolas de Microsoft y Sony son una buena inversión, aunque hay que tener en cuenta que en el caso de Xbox 360 hay que hacer un desembolso extra.

En cuanto a los juegos, está claro que hay dos bandos separados. Nintendo ha apostado por la jugabilidad frente al espectáculo gráfico, y parece que inicialmente el público está respondiendo bastante bien, ya que actualmente el número de consolas que vende es superior al de la competencia. También hay que tener en cuenta que muchos desarrolladores -como la propia Ubi Soft ha admitido- han aprovechado la facilidad de desarrollo para sacar al mercado juegos de una calidad muy deficiente, y todavía queda bastante para comprobar lo que puede ofrecer Wii.

Las otras consolas ofrecen una potencia bruta enorme, y todavía está por ver la teórica superioridad de Playstation 3 en este sentido. Por otra parte, la ventaja temporal de Xbox 360 ha permitido que veamos juegos como "Gears of War", un título que demuestra que la última palabra siempre la tienen los desarrolladores.

Todo apunta a que la "batalla" va a ser realmente interesante durante los próximos años, y todas las compañías van a tener que ofrecer productos interesantes si quieren ganarse a los usuarios. ¿Con cuál te quedas?

domingo, 28 de diciembre de 2008

Hibernate GenericDao

Hola aqui posteare un ejemplo del manejo de los multiconocidos y muy ùtiles GenericDaos de Hibernate. Tambien, mostrare como acomodar dichos Daos con sus Servicios junto con sus implementaciones respectivas de cada uno. Espero les
paresca interesante.


GenericDAO.java

import java.util.Collection;
import java.util.List;
import org.hibernate.Criteria;

/**
* @author Ricardo Guerra
*/
public interface GenericDAO{

public void save(Object object);

public void saveObject(Object object);

public void updateObject( Object object );

public void delete(Object persistentInstance);

public Object findById( Class clazz, java.io.Serializable id);

public Object find( Class clazz, Long id );

public List findByObject(Object object);

public List findByExample(Object exampleInstance, String... excludeProperty);

public List findLikeExample(Object exampleInstance, String... excludeProperty);

public List findLikeExampleOrdered(Object exampleInstance, String[] orders,String... excludeProperty);

public List findLikeExampleOrdered (Object exampleInstance, List orders,String... excludeProperty );

public void deleteById(Class clazz, java.io.Serializable id);

public List findAll(Class clazz);

public List findAllClass();

public List getFindCriteria(Object object);

public List getFindCriteria(Object object, String ordenado);

public List getFindCriteria(Object object, String ordenado, String restringe);

public List getFindCriteria(Object object, int maxResults, String ordenado);

public List getFindCriteria(Object object, int maxResults);

public Criteria getCriteria(Object object);

public Criteria getCriteria(Object object, String ordenado);

public void initializeCollection(java.util.Collection collection);

public void initializeCollection2(Collection col);

public void initializeObject(Object o);

public void initialize(Object object);

public String getSequenceNextValue(String sequence );

public boolean exists(Class clazz,java.io.Serializable id);

public void saveCollection(java.util.Collection collection);

public void saveCollection2(java.util.Collection collection);

public void merge(Object object);

public void flush();

public void setNull(Object obj);
}


GenericDAOImpl.java

import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.java.model.dao.generic.GenericDAO;
import org.java.model.util.Util;
import org.springframework.orm.hibernate3.HibernateQueryException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.apache.commons.lang.StringUtils;

/**
* @author Ricardo Guerra
*/

public class GenericDAOImpl extends HibernateDaoSupport implements GenericDAO{

private Logger logger = Logger.getLogger( this.getClass().getName() );


public GenericDAOImpl(){
}

public void save(Object object) {
logger.debug("saving instance");
try{
getHibernateTemplate().saveOrUpdate(object);
logger.debug("save successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void updateObject( Object object ) {
logger.debug("updating instance");

try{
getHibernateTemplate().update(object);
logger.debug("update successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void saveObject(Object object) {
logger.debug("saving instance");

try{
getHibernateTemplate().save(object);
logger.debug("save successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void delete(Object object) {
logger.debug("deleting instance");

try{
getHibernateTemplate().delete(object);
logger.debug("delete successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public Object findById(Class clazz, java.io.Serializable id) {
logger.debug("getting instance with id: " + id+" from class: "+clazz.getName());

try{
Object instance = getHibernateTemplate().get(clazz, id);
return instance;
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public Object find( Class clazz, Long id ){
return getHibernateTemplate().load(clazz, id);
}

public List findByObject(Object object) {
logger.debug("getting instance with id: ");

try {
return getHibernateTemplate().findByExample(object);
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List findByExample(Object exampleInstance, String... excludeProperty ){
try{
Criteria criteria = getSession().createCriteria(exampleInstance.getClass());
Example example = Example.create(exampleInstance).ignoreCase();

for( String exclude : excludeProperty ){
example.excludeProperty(exclude);
}
criteria.add(example);

return criteria.list();
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List findLikeExample( Object exampleInstance, String... excludeProperty ){
try{
Criteria criteria = getSession().createCriteria( exampleInstance.getClass());
Example example = Example.create(exampleInstance).enableLike().ignoreCase();

for (String exclude : excludeProperty ){
example.excludeProperty(exclude);
}
criteria.add(example);
return criteria.list();
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List findLikeExampleOrdered(Object exampleInstance, String[] orders,String... excludeProperty){

try{
Criteria criteria = getSession().createCriteria(exampleInstance.getClass());
Example example = Example.create(exampleInstance).enableLike().ignoreCase();

for (String exclude : excludeProperty) {
example.excludeProperty(exclude);
}
for (String order : orders) {
criteria.addOrder(Order.asc(order));
}
criteria.add(example);

return criteria.list();
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}


public List findLikeExampleOrdered (Object exampleInstance, List orders,String... excludeProperty ){

try{
Criteria criteria = getSession().createCriteria(exampleInstance.getClass());
Example example = Example.create(exampleInstance).enableLike().ignoreCase();

for( String exclude : excludeProperty) {
example.excludeProperty(exclude);
}
for( String order : orders) {
criteria.addOrder(Order.asc(order));
}
criteria.add(example);
return criteria.list();
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

private List findByExample(Object exampleInstance, boolean soloActivos, String... excludeProperty) {
if( !soloActivos ){
//String [] arr = {"estado"};
excludeProperty[excludeProperty.length] = "estado";
}
return findByExample(exampleInstance, excludeProperty);
}

public void deleteById(Class clazz, java.io.Serializable id) {
logger.debug("deleting instance with id: " + id+" from class: " + clazz.getName());

try{
Object object2 = this.findById(clazz, id);
getHibernateTemplate().delete(object2);
logger.debug("delete successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List findAll(Class clazz) {
logger.debug("getting instances from class : " + clazz.getName());
List list = null;

try{
list = getHibernateTemplate().find("from " + clazz.getSimpleName());
logger.debug("Find result: " + list.size() + " objects");
return list;
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List findAllClass() {
logger.debug("getting instances from class ");
List list = null;

try{
list = getHibernateTemplate().find("from Object");
logger.debug("Find result: " + list.size() + " objects");
return list;
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List getFindCriteria(Object object) {
List list = null;

try{
Criteria c = getCriteria(object);
List list2 = c.list();
list = new ArrayList(list2);
}
catch( HibernateException e ){
e.printStackTrace();
throw getHibernateTemplate().convertHibernateAccessException(e);
}
logger.debug("Find result: " + list.size() + " objects");
return list;
}

public Criteria getCriteria( Object object ) {

try{
this.setNull(object);

Criteria criteria = getSession().createCriteria( object.getClass() );
Example example = Example.create(object).enableLike(MatchMode.ANYWHERE).ignoreCase().excludeZeroes();
criteria.add(example);

return criteria;
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List getFindCriteria(Object object, String ordenado) {
List list = null;

try{
this.setNull(object);
list = (List) getCriteria(object, ordenado).list();
}
catch (HibernateException e) {
e.printStackTrace();
throw getHibernateTemplate().convertHibernateAccessException(e);
}
logger.debug("Find result: " + list.size() + " objects");
return list;
}

public Criteria getCriteria(Object object, String ordenado) {
this.setNull(object);
Criteria criteria = getCriteria(object);
criteria.addOrder(Order.asc(ordenado));
return criteria;
}

public void setNull(Object obj) {
try{
if (obj != null) {
Field fields[] = obj.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; ++i) {
fields[i].setAccessible(true);
if (fields[i].getType().getName().equals("java.lang.Long")) {
Long valor = (Long) fields[i].get(obj);
if (fields[i].get(obj) != null
&& valor.longValue() == 0) {
fields[i].set(obj, null);
}
}
if (fields[i].getType().getName()
.equals("java.lang.String")
|| fields[i].getType().getName().equals(
"java.util.Date")) {
if (fields[i].get(obj) != null
&& fields[i].get(obj).equals("")) {
fields[i].set(obj, null);
}
}
}
}
}
catch (Exception e) {
logger.error("error al setear null :" + e.getMessage());
}
}

public void initializeCollection( Collection collection ){
try{
Hibernate.initialize(collection);
Iterator it=collection.iterator();

while(it.hasNext()){
Hibernate.initialize(it.next());
}
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void initialize(Object obj){
Hibernate.initialize(obj);
}

public boolean exists(Class clazz,Serializable id){
return getHibernateTemplate().get(clazz,id)!=null;
}

public void saveCollection(Collection collection){
try{
java.util.Iterator it=collection.iterator();

while(it.hasNext()){
save(it.next());
}
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void flush() {
logger.debug("flush");

try{
getHibernateTemplate().flush();
logger.debug("flush successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List getFindCriteria(Object object, int maxResults, String ordenado) {
List list = null;

try{
Criteria criteria = null;
this.setNull(object);

if( StringUtils.isEmpty(ordenado)){
criteria = getCriteria(object);
}
else{
criteria = getCriteria(object, ordenado);
}
criteria.setMaxResults(maxResults);
list = (List) criteria.list();
}
catch(HibernateException e) {
logger.error(e.getMessage(), e);
throw getHibernateTemplate().convertHibernateAccessException(e);
}
catch( RuntimeException e ){
logger.error(e.getMessage(), e);
throw e;
}
logger.debug("Find result: " + list.size() + " objects");
return list;
}

private Criteria getCriteria(Object object, String ordenado, String restringeNull) {
try{
Criteria criteria = getCriteria(object,ordenado);

if(!StringUtils.isEmpty(restringeNull)){
String[] rn=restringeNull.split(",");
for(int i=0;i criteria.add(Restrictions.isNull(rn[i]));
}
}
return criteria;
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public List getFindCriteria(Object object, String ordenado, String restringeNull) {
List list=(List) getCriteria(object,ordenado,restringeNull);
return list;
}

public List getFindCriteria(Object object, int maxResults) {
return getFindCriteria(object,maxResults,null);
}

/**
* Metodo para obtener el valor siguiente para un secuencia
* @param sequence
* @return String
*/
public String getSequenceNextValue( String sequence ){
String resultado = "0" ;
String sql = "SELECT " + sequence + ".NEXTVAL FROM DUAL";

List result = getSession().createSQLQuery(sql).list();

if( Util.collectioEnabled(result) ){
resultado = String.valueOf(result.get(0));
}

return resultado;
}

public void initializeCollection2(Collection col){
if( col != null ){
Hibernate.initialize(col);
Iterator it=col.iterator();

while(it.hasNext()){
Object obj = it.next();
initializeObject(obj);
}
}
}

public void initializeObject(Object o){
Hibernate.initialize(o);
//Configuration a = new Configuration();
//Iterator i = a.getClassMappings();
for( Field campo:o.getClass().getDeclaredFields() ){
Object tr = new Object();

try{
Method getter = org.springframework.beans.BeanUtils.findDeclaredMethodWithMinimalParameters(o.getClass(), Util.getNombreGetter(campo));
if (getter!=null) {
tr = getter.invoke(o, null);
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
}
catch (IllegalAccessException e) {
e.printStackTrace();
}
catch (InvocationTargetException e) {
e.printStackTrace();
}

Hibernate.initialize(tr);
}
}

public void merge(Object object) {
logger.debug("saving instance");

try{
getHibernateTemplate().merge(object);
logger.debug("merge successful");
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}

public void saveCollection2(Collection collection){

try{
java.util.Iterator it=collection.iterator();

while(it.hasNext()){
save(it.next());
}
}
catch( HibernateQueryException e ){
logger.error("The Error is: ", e );
throw e;
}
catch( RuntimeException e ){
logger.error("The Error is: ", e );
throw e;
}
}
}

GenericService.java

import java.util.Collection;
import java.util.List;
import org.hibernate.Criteria;

/**
* @author Ricardo Guerra
*/
public interface GenericService{


public void save(Object object);

public void saveObject(Object object);

public void updateObject( Object object );

public void delete(Object persistentInstance);

public Object findById( Class clazz, java.io.Serializable id);

public Object find( Class clazz, Long id );

public List findByObject(Object object);

public List findByExample(Object exampleInstance, String... excludeProperty);

public List findLikeExample(Object exampleInstance, String... excludeProperty);

public List findLikeExampleOrdered(Object exampleInstance, String[] orders,String... excludeProperty);

public List findLikeExampleOrdered (Object exampleInstance, List orders,String... excludeProperty );

public void deleteById(Class clazz, java.io.Serializable id);

public List findAll(Class clazz);

public List findAllClass();

public List getFindCriteria(Object object);

public List getFindCriteria(Object object, String ordenado);

public List getFindCriteria(Object object, String ordenado, String restringe);

public List getFindCriteria(Object object, int maxResults, String ordenado);

public List getFindCriteria(Object object, int maxResults);

public Criteria getCriteria(Object object);

public Criteria getCriteria(Object object, String ordenado);

public void initializeCollection(java.util.Collection collection);

public void initializeCollection2(Collection col);

public void initializeObject(Object o);

public void initialize(Object object);

public String getSequenceNextValue(String sequence );

public boolean exists(Class clazz,java.io.Serializable id);

public void saveCollection(java.util.Collection collection);

public void saveCollection2(java.util.Collection collection);

public void merge(Object object);

public void flush();

public void setNull(Object obj);
}


GenericServiceImpl.java

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.hibernate.Criteria;
import org.java.model.dao.generic.GenericDAO;
import org.java.model.service.generic.GenericService;

/**
* @author Ricardo Guerra
*/
public class GenericServiceImpl implements GenericService{

private GenericDAO genericDAO;


//Constructor...
public GenericServiceImpl(){
}

public GenericDAO getGenericDAO() {
return genericDAO;
}

public void setGenericDAO(GenericDAO genericDAO) {
this.genericDAO = genericDAO;
}

public void save(Object object){
this.genericDAO.save(object);
}

public void saveObject(Object object) {
this.genericDAO.saveObject( object );
}

public void updateObject(Object object) {
this.genericDAO.updateObject( object );
}

public void delete(Object object) {
this.genericDAO.delete(object);
}

public Object findById(Class clazz, Serializable id) {
Object obj = genericDAO.findById(clazz,id);
return obj;
}

public Object find( Class clazz, Long id ){
Object obj = genericDAO.find(clazz,id);
return obj;
}

public List findByObject(Object object) {
List lista = (List)genericDAO.findByObject(object);
return lista;
}

public List findByExample(Object exampleInstance, String... excludeProperty) {
return genericDAO.findByExample(exampleInstance, excludeProperty);
}

public List findLikeExample(Object exampleInstance, String... excludeProperty) {
return genericDAO.findLikeExample(exampleInstance, excludeProperty);
}

public List findLikeExampleOrdered( Object exampleInstance, String[] orders, String... excludeProperty ){
return genericDAO.findLikeExampleOrdered( exampleInstance, orders, excludeProperty);
}

public List findLikeExampleOrdered( Object exampleInstance, List orders, String... excludeProperty ){
return genericDAO.findLikeExampleOrdered( exampleInstance, orders, excludeProperty);
}

public void deleteById(Class clazz, Serializable id) {
this.genericDAO.deleteById(clazz, id);
}

public List findAll( Class clazz ){
List lista = this.genericDAO.findAll(clazz);
return lista;
}

public List findAllClass(){
List lista = this.genericDAO.findAllClass();
return lista;
}

public List getFindCriteria(Object object) {
List lista = this.genericDAO.getFindCriteria(object);
return lista;
}

public List getFindCriteria(Object object, String ordenado) {
List lista = this.genericDAO.getFindCriteria(object,ordenado);
return lista;
}

public Criteria getCriteria(Object object) {
Criteria lista = this.genericDAO.getCriteria(object);
return lista;
}

public Criteria getCriteria(Object object, String ordenado) {
Criteria lista = this.genericDAO.getCriteria(object, ordenado);
return lista;
}

public void setNull(Object obj){
this.genericDAO.setNull(obj);
}

public void initializeCollection(Collection collection){
this.genericDAO.setNull(collection);
}

public void initialize(Object obj){
this.genericDAO.setNull(obj);
}

public boolean exists( Class clazz, java.io.Serializable id){
return genericDAO.exists(clazz,id);
}

public void saveCollection(Collection collection){
this.genericDAO.saveCollection(collection);
}

public void flush(){
this.genericDAO.flush();
}

public List getFindCriteria(Object object, String ordenado,String restringe) {
List lista = this.genericDAO.getFindCriteria(object,ordenado, restringe);
return lista;
}

public List getFindCriteria(Object object, int maxResults, String ordenado) {
List lista = this.genericDAO.getFindCriteria(object, maxResults, ordenado);
return lista;
}

public List getFindCriteria( Object object, int maxResults ){
List lista = this.genericDAO.getFindCriteria( object, maxResults );
return lista;
}

public String getSequenceNextValue( String sequence ){
String secuencia = this.genericDAO.getSequenceNextValue( sequence );
return secuencia;
}

public void initializeCollection2(Collection col) {
this.genericDAO.initializeCollection2(col);
}

public void initializeObject(Object obj) {
this.genericDAO.initializeObject( obj );
}

public void merge(Object object) {
this.genericDAO.merge( object );
}

public void saveCollection2(Collection collection) {
this.genericDAO.saveCollection2( collection );
}
}

Integrando Spring 3 + Hibernate 3 + JSF + MAVEN

Hola a todos, hace ya algun tiempo que ya no posteo nada, ya que he
estado bien ocupado ultimamente, por eso motivo regreso aqui para compartirles
una aplicación J2EE demo donde muestro la integración que he realizado de los Frameworks: Spring 3 + Hibernate 3 + JSF + MAVEN.

El entorno en la que he trabajo es similar al del demo que postee
hace ya algun tiempo:

La aplicaciòn demo esta dividida en 2 carpetas:

Demo_Spring_Hibernate_Jsf: Que contiene todo el Proyecto Web en las carpetas 'src' y 'WebContent'. ( Las cuales las reemplazaras en un proyecto dinamico que crearas desde Eclipse ).

La aplicacion muestra un simple login en donde se genera una sesion de usuario que redirecciona hacia una interfaz de bienvenida, pero lo realmente interesante es la arquitectura segmentada, que se esta manejando para realizar dicho proceso.

Para descargar el demo pulsar: AQUI..

Para descargar el PDF "SIMILITUD: HQL vs CRITERIA" pulsar: AQUI..

sábado, 8 de noviembre de 2008

Integrando Spring 2.5 & Hibernate 3

Hola aquí les comparto mi aplicación demo donde muestra la integración que he realizado de los Frameworks: Spring 2.5 & Hibernate 3.
El entorno en la que he trabajo cuenta con lo siguiente:

- IDE: Red Hat Developer Studio 1.0.0.CR1
(http://www.jboss.com/products/devstudio)
Que integra un Eclipse 3.3 con una seria de plugins muy útiles como:
JBoss Application Server
Hibernate Tools
JSF Tools, etc. Y un entorno de diseño que para mi es el mejor.

- Plataforma: JAVA 6
- Frameworks: Spring 2.5 - Hibernate 3
- Motor de Datos: MySql Server 5.0

Explicación Ràpida:
El demo al ejecutarse muestra el resultado en consola de tres registros devueltos por tres listas y un bean devuelto por un objeto de la base de datos. El demo esta en base a un proyecto JAVA de tipo Web Dinámico, en donde he creado una Arquitectura que permita segmentar correctamente las Capas, Daos y Servicios respectivos. Si bien el demo no lo he hecho para Web (Esta Vez), la arquitectura que se maneja esta preparada para ser utilizada de esta manera (En un próximo demo mostrare ello).

Aquí estoy utilizando Spring 2.5 para el manejo de la capa de negocio y Hibernate 3 para lo que es la capa de persistencia. Asimismo, se esta manejando los populares y muy útiles Generic Dao. Además, en el ejemplo se muestra dentro de la clase (UsuarioDAOImpl.java), las diferentes formas de cómo manipular las transacciones en base al manejo de sesiones por medio de Hibernate 3 (métodos: obtenerUsuarioForma01 y obtenerUsuarioForma02) y por medio de Spring 2.5 (método: obtenerUsuarioForma03). Finalmente, la conexión en la aplicación la estoy manejando vía JDBC en base a 2 archivos:

• jdbc.properties (para Spring).
• hibernate.cfg.xml (para Hibernate).

Además, he puesto dentro de la carpeta DataBase el script de la base de datos que estoy utilizando, dentro de la carpeta lib del proyecto todas las librerías necesarias, para que simplemente importen el proyecto, en el Build-Path acomoden el JDK respectivo y listo. Finalmente, hay dos archivos dentro de la carpeta 'Otros':

• Driver_Url_JDBC: Muestra los diferentes Drives y URL para conexiones JDBC para diferentes motores de Datos.
• HibernateDialect: Muestra los diferentes Dialectos Hibernate para diferentes motores de Datos.

Para descargar la aplicacion Demo, pulsar AQUI..
Para descargar las librerias base del Demo, pulsar AQUI.

Espero que les haya gustado el demo preparado y ya estaré colgando en estos días este mismo ejemplo pero orientado netamente a Web y unido con otro Framework JSF.


Foto Aplicacion #1


Foto Aplicacion #2


Foto Aplicacion #3


Para descargar el PDF "SIMILITUD: HQL vs CRITERIA" pulsar: AQUI..