Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas
Mostrando entradas con la etiqueta Linux. Mostrar todas las entradas

martes, 6 de mayo de 2008

Tutorial de Hibernate

Este tutorial se basa en el mapeo de una base de datos en Postgresql, utilizando eclipse y el Hibernate Tools.

Primero crearemos el usuario y la base de datos a utilizar
$ createuser -P -U postgres mundo
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
CREATE ROLE
$ createdb -U mundo -W mundo
Password:
CREATE DATABASE
$


Ahora con el siguiente script, creamos la estructura de la base de datos

mundo.sql
SET client_encoding = 'UTF8';
SET check_function_bodies = false;
SET client_min_messages = warning;

-- Table: continente

CREATE TABLE continente
(
codcontinente serial NOT NULL,
nombre character varying(50) NOT NULL,
CONSTRAINT pk_continente PRIMARY KEY (codcontinente)
)
WITH (OIDS=FALSE);
ALTER TABLE continente OWNER TO mundo;

-- Table: pais

CREATE TABLE pais
(
codpais serial NOT NULL,
valor character varying(50) NOT NULL,
codcontinente integer NOT NULL,
CONSTRAINT pk_pais PRIMARY KEY (codpais),
CONSTRAINT fk_continente FOREIGN KEY (codcontinente)
REFERENCES continente (codcontinente) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE pais OWNER TO mundo;

-- Index: fki_pais_continente

CREATE INDEX fki_pais_continente
ON pais
USING btree
(codcontinente);


$ psql -U mundo -W -f mundo.sql
Password for user mundo:
SET
SET
SET
CREATE TABLE
ALTER TABLE
CREATE TABLE
ALTER TABLE
CREATE INDEX
$


Ahora crearemos la aplicación que utilizará estas dos tablas.

Primero creamos un "Java Proyect"


Le agregamos las librerías necesarias para Hibernate y el driver jdbc para Postgresql

Una vez creado el proyecto, agregamos el archivo de configuración de Hibernate


Lo dejamos en la raíz del directorio de recursos.


Definimos los parámetros de conexión con la base de datos.

Creamos el "Hibernate Console Configuration", este es el perfil que define todas las características del proyecto con Hibernate.


Una vez creado el "Console Configuration", podemos ir a la vista de Hibernate y ejecutar el generador de código.


Creamos un nuevo perfil.


Le indicamos las caracteristicas de nuestro proyecto.


Le idicamos que genere los archivos de configuración de Hibernate y las clases POJO. Y ejecutamos.


Aquí podemos ver el código generado.


Luego agregamos hibernate.revenge.xml, el archivo de filtro para la ingeniería inversa.

Le indicamos que se guarde en el directorio de recursos del proyecto.

Podemos agregar algún retoque, por ejemplo, que los campos INTEGER de la base de datos, sean mapeados como java.lang.Integer.


Retocamos las claves primarias, para que utilicen la secuencia definida en la base de datos.


Lo mismo con la otra tabla.


Ahora agregagemos un par de clases de servicio, que nos ayudaran con las operaciónes CRUD.

SessionFactory.java : como su nombre lo indica es una fábrica de sesiones.

package test;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution. Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html }.
*/
public class SessionFactory {

/**
* Location of hibernate.cfg.xml file.
* Location should be on the classpath as Hibernate uses
* #resourceAsStream style lookup for its configuration file.
* The default classpath location of the hibernate config file is
* in the default package. Use #setConfigFile() to update
* the location of the configuration file for the current session.
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static final ThreadLocal threadLocal = new ThreadLocal();
private static Configuration configuration = new Configuration();
private static org.hibernate.SessionFactory sessionFactory;
private static String configFile = CONFIG_FILE_LOCATION;

private SessionFactory() {
}

/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the SessionFactory if needed.
*
* @return Session
* @throws HibernateException
*/
public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();

if (session == null || !session.isOpen()) {
System.out.println("<<<<<<<<<>>>>>>>");
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}

return session;
}

/**
* Rebuild hibernate session factory
*
*/
public static void rebuildSessionFactory() {
try {
configuration.configure(configFile);
sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}

/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);

if (session != null) {
session.close();
}
}

/**
* return session factory
*
*/
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}

/**
* return session factory
*
* session factory will be rebuilded in the next call
*/
public static void setConfigFile(String configFile) {
SessionFactory.configFile = configFile;
sessionFactory = null;
}

/**
* return hibernate configuration
*
*/
public static Configuration getConfiguration() {
return configuration;
}

}



ControlHibernate.java
package test;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class ControlHibernate {

private static Logger log = Logger.getLogger(ControlHibernate.class);

public static List getObjetos(String hql) throws HibernateException {
List items = new ArrayList();
Session session = null;
Transaction tx = null;
session = SessionFactory.getSession();
try {
tx = session.beginTransaction();
items = session.createQuery(hql).list();
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
} finally {
session.close();
}
return items;
}

public static void guardarObjeto(Object objeto, Integer codigo)
throws HibernateException {
Session session = null;
Transaction tx = null;
session = SessionFactory.getSession();
try {
tx = session.beginTransaction();
// modifica objeto
if ((codigo != null) && (codigo.intValue() != 0)) {
log.info("va a hacer 'merge' de objeto");
session.saveOrUpdate(objeto);
session.flush();
} else { // inserta objeto
log.info("va a hacer 'save' de objeto");
session.save(objeto);
}
tx.commit();
} catch (HibernateException e) {
if (tx != null)
tx.rollback();
throw e;
} finally {
session.close();
}
}
}

Como prueba final de este tutorial, Creamos una clase Prueba.java , que crea un objeto Pais, con un objeto Continente anidado y los almacena en la base de datos.


Aquí podemos observer que los datos se ingresaron correctamente.

También podemos utilizar el editor de sentencias HQL, para realizar pruebas.


Si tienes una crítica o aporte, no dudes en comentarla.

:wq

viernes, 2 de mayo de 2008

Creando un proyecto Flex con Java y BlazeDS con RemoteObject en entornos separados

En este tutorial explico paso a paso la creación de un proyecto Flex con Java en entornos separados (front-end - back-end), con BlazeDS y RemoteObject (en Linux).

Se asume tener instalado Jdk y con sus variables de entorno, sino puedes revisar aquí

Configuración del Back-end

Primero debemos bajar BlazeDS, en mi caso bajé el Turnkey, pues ya viene deployado el BlazeDS.
Lo dejé en /home/rene/blazeds_turnkey_3-0-0-544.

Ahora en eclipse creamos un Java Project


Le ponemos un nombre y le indicamos la ruta del Turnkey, como se vé en la imagen. Y siguiente


Establemos la carpeta src como "source folder", ya que por default no lo es. Le idicamos que las clases compiladas deben quedar en el directorio "classes". Y finalizamos

Creamos una clase de prueba.


Le ponemos nombre a la clase y la dejamos bajo un paquete.


Creamos un simple método que retorne un String.


Lo declaramos como "destination" en el archivo "flex/remoting-config.xml"


Agregamos una sección de "login-config" en el web.xml

<login-config>
<auth-method>BASIC</auth-method>
</login-config>



Guardamos todo y levantamos el servidor:

$ cd blazeds_turnkey_3-0-0-544/sampledb/
rene ~/blazeds_turnkey_3-0-0-544/sampledb $ ./startdb.sh
[Server@18a7efd]: [Thread[main,5,main]]: checkRunning(false) entered
[Server@18a7efd]: [Thread[main,5,main]]: checkRunning(false) exited
[Server@18a7efd]: Startup sequence initiated from main() method
[Server@18a7efd]: Loaded properties from [/home/rene/blazeds_turnkey_3-0-0-544/sampledb/server.properties]
[Server@18a7efd]: Initiating startup sequence...
[Server@18a7efd]: Server socket opened successfully in 29 ms.
[Server@18a7efd]: Database [index=0, id=0, db=file:flexdemodb/flexdemodb, alias=flexdemodb] opened sucessfully in 1203 ms.
[Server@18a7efd]: Startup sequence completed in 1233 ms.
[Server@18a7efd]: 2008-04-30 23:14:53.387 HSQLDB server 1.8.0 is online
[Server@18a7efd]: To close normally, connect and execute SHUTDOWN SQL
[Server@18a7efd]: From command line, use [Ctrl]+[C] to abort abruptly

$ cd blazeds_turnkey_3-0-0-544/tomcat/bin/
rene ~/blazeds_turnkey_3-0-0-544/tomcat/bin $ ./startup.sh
Using CATALINA_BASE: /home/rene/blazeds_turnkey_3-0-0-544/tomcat
Using CATALINA_HOME: /home/rene/blazeds_turnkey_3-0-0-544/tomcat
Using CATALINA_TMPDIR: /home/rene/blazeds_turnkey_3-0-0-544/tomcat/temp
Using JRE_HOME: /usr/local/jdk1.6.0_06
$
Comprobamos abriendo el navegador en http://localhost:8400

Configuración del Front-end

Ahora creamos un Flex Project (en el Flex Builder plugin para Linux)


En la configuración del server le indicamos donde están los servicio que vamos a consumir y donde queremos colocar lo archivos generado y compilados.

Creamos una simple aplicación que consuma el RemoteObject definido en el destination. Y ejecutamos la aplicación.


Al pinchar el botón, su label se cargará con lo que retorna el método de la clase java.

:wq

miércoles, 16 de abril de 2008

Instalar Jdk y Tomcat

Aun que es un tema menor, no falta el que pregunta "..oye, como instalo java.." [ack] ¬¬
bueno... descarga el Jdk de http://java.sun.com/javase/downloads/index.jsp busca el que dice JDK6 Update N°

ya descargado, lo ejecutamos y lo movemos a un directorio del sistema

$ chmod +x jdk-6u6-linux-i586.bin
$ ./jdk-6u6-linux-i586.bin
#mv jdk1.6.0_06 /usr/local


Luego establecimos las variables en el sistema (/etc/profile) para que encuentre le directorio de instalación

# vi /etc/profile
(Y agregamos estas lineas al final del archivo)

export JAVA_HOME=/usr/local/jdk1.6.0_06
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib


Incorporamos las variables:

# source /etc/profile


Lo mismo para Tomcat. Lo bajamos de http://archive.apache.org/dist/tomcat/ la última version

$ tar -xzvf apache-tomcat-6.0.16.tar.gz
$ cd apache-tomcat-6.0.16/bin
$ ./startup.sh


Se puede comprobar en el navegador, abriendo la dirección http://localhost:8080/


:wq

viernes, 7 de marzo de 2008

Corregir la extension de la CLST (Chile)

Como ya sabrán el gobierno de Chile anunció un paquete de medidas para soportar la crisis de hidro-abastecimiento que pasa nuestro Chilito. Entre las que se cuenta la reducción del voltaje (suministradas por las distribuidoras) hasta en un 10% de la tensión nominal, flexibilizar el uso de los hídro-recursos a partir del 15 de Febrero y la extensión del horario de verano hasta el último sábado de Marzo.

Es ésta última medida la que da trabajo a los administradores de sistemas, ya que los sistemas operativos juran de guata que el cambio va el 8 de Marzo.

$ zdump -v Chile/Continental | grep 2008
Chile/Continental Sun Mar 9 02:59:59 2008 UTC = Sat Mar 8 23:59:59 2008 CLST isdst=1
Chile/Continental Sun Mar 9 03:00:00 2008 UTC = Sat Mar 8 23:00:00 2008 CLT isdst=0
Chile/Continental Sun Oct 12 03:59:59 2008 UTC = Sat Oct 11 23:59:59 2008 CLT isdst=0
Chile/Continental Sun Oct 12 04:00:00 2008 UTC = Sun Oct 12 01:00:00 2008 CLST isdst=1

Entonces lo que hay que hacer es bajar los archivos con las reglas de las zonas horarias, hacer los cambios correspondientes y compilarlas.

# wget ftp://elsie.nci.nih.gov/pub/tzdata2007k.tar.gz
# tar xzvf tzdata2007k.tar.gz
africa
antarctica
asia
australasia
europe
northamerica
southamerica
pacificnew
etcetera
factory
backward
systemv
solar87
solar88
solar89
iso3166.tab
zone.tab
leapseconds
yearistype.sh
# chmod +w southamerica


Aplicamos estos cambios:

--- southamerica 2008-03-07 09:50:53.000000000 -0300
+++ southamerica.new 2008-03-07 09:53:16.000000000 -0300
@@ -789,7 +789,9 @@
Rule Chile 1998 only - Sep 27 4:00u 1:00 S
Rule Chile 1999 only - Apr 4 3:00u 0 -
Rule Chile 1999 max - Oct Sun>=9 4:00u 1:00 S
-Rule Chile 2000 max - Mar Sun>=9 3:00u 0 -
+Rule Chile 2000 2007 - Mar Sun>=9 3:00u 0 -
+Rule Chile 2008 only - Mar 29 3:00u 0 -
+Rule Chile 2009 max - Mar Sun>=9 3:00u 0 -
# IATA SSIM anomalies: (1992-02) says 1992-03-14;
# (1996-09) says 1998-03-08. Ignore these.
# Zone NAME GMTOFF RULES FORMAT [UNTIL]

Compilamos

# zic -l America/Santiago southamerica


Y comprobamos los cambios

# zdump -v America/Santiago |grep 2008
America/Santiago Sat Mar 29 02:59:59 2008 UTC = Fri Mar 28 23:59:59 2008 CLST isdst=1 gmtoff=-10800
America/Santiago Sat Mar 29 03:00:00 2008 UTC = Fri Mar 28 23:00:00 2008 CLT isdst=0 gmtoff=-14400
America/Santiago Sun Oct 12 03:59:59 2008 UTC = Sat Oct 11 23:59:59 2008 CLT isdst=0 gmtoff=-14400
America/Santiago Sun Oct 12 04:00:00 2008 UTC = Sun Oct 12 01:00:00 2008 CLST isdst=1 gmtoff=-10800

Listo !!