Beruflich Dokumente
Kultur Dokumente
Este libro cubre el Framework de hibernacin desde cero. Si usted est buscando una
introduccin breve, dulce y sencilla de Hibernate, impulsado principalmente por
ejemplos, este libro es para usted. Si usted tiene slo un fin de semana para pasar el
aprendizaje del Framework antes de iniciar un proyecto de Hibernate el lunes, este
libro es lo que ms le conviene. Si est familiarizado con el Framework, pero oxidado
con los detalles, este es un buen repaso!
Si usted es un desarrollador de Hibernate sazonada, este libro probablemente no es
para ti; se destina principalmente a traer a alguien al da en la tecnologa (pero no
dude en echar un vistazo a travs de, usted puede encontrar algo interesante!).
Una nota de precaucin: este libro no es en absoluto una biblia en el Framework de
hibernacin. He intentado muy duro para condensar el material en unas 100 pginas.
Si usted est buscando para los conceptos muy avanzados, no recomendara este
libro.
Por qu escrib este libro
Creo que hay dos niveles de aprendizaje, al igual que una comida de dos platos. El
primer curso es simple y fcil, pero crea expectativas para un segundo plato apetitoso.
No slo satisface nuestra hambre, hasta cierto punto, pero tambin nos da una idea
de lo que est por venir en el segundo curso.
Muchos libros ofrecen comidas de dos cursos de una sola vez. Esto es grande para
muchos de nosotros. Sin embargo, en mi opinin, es posible que no tenga tiempo o el
espacio adecuado para conocer las profundidades de la recta tecnologa.
Creo en servir una comida de primer curso, atrayente, apetitoso, que convence a los
huspedes a permanecer durante el segundo curso. Es una tarea difcil ya veces
desalentador para servir a este tipo de comida!
Trabajar con mi hijo de siete aos de edad, hijo, Joshua, en su tarea me ayud a
entender lo importante (y difcil) es para ensear conceptos bsicos y fundamentos de
una manera sencilla y fcil. Agarr incluso los temas ms difciles de forma rpida
cuando llegu a su nivel, explicando con ejemplos y lenguaje fcil de entender.
Hay personas que estn realmente interesados en el aprendizaje de la tecnologa,
pero pueden se deje intimidar por los grandes textos o manuales. Estas personas son
entusiastas y quieren comenzar a ejecutar, pero no tienen el tiempo o la paciencia
para leer y digerir volmenes de datos! Slo tienen tiempo para leer un libro sencillo,
aprender la tecnologa, y saltar directamente a la prctica. Una vez que consiguen la
cada de ella, su materia gris pedir ms y ms.
Cuando quiero aprender algo nuevo, empiezo a experimentar con el cdigo bsico,
mueva una pulgada ms, quemar un poco de cdigo, y as sucesivamente. Una vez
que tengo una sensacin para el Framework, me dirijo a otras vas para saciar mi sed.
En ese momento, yo busco los avanzados, manuales en profundidad y caractersticas,
y por supuesto, los grandes libros.
Este libro debe darle suficiente conocimiento y la confianza para empezar a trabajar
en proyectos del mundo real.
Primero vamos a crear una aplicacin Java sencilla para almacenar y recuperar
pelculas desde una base de datos.
Aplicacin MovieManager
Considere la posibilidad de una aplicacin Java llamada MovieManager cuyo trabajo
principal es guardar, encontrar y recuperar las pelculas desde una base de datos.
Adems de la codificacin de la aplicacin Java, necesitamos una tabla de base para
almacenar la informacin de la pelcula. Esta tabla MOVIES almacenar los datos sobre
pelculas como filas, como se muestra en la Tabla 1-1.
una
instancia
de
la
pelcula
en
nuestra
aplicacin
instruccin SELECT con el fin de obtener todas los pelculas disponibles e imprimirlos a
la consola.
Sin embargo, hay algunas cosas a tener en cuenta:
Utilizamos una declaracin SQL predefinida para insertar (o seleccione) los
valores de columna.
Establecemos la columna con valores uno por uno usando el nmero de
posicin (o el nombre de la columna).
Cogemos la SQLException si el cdigo se porta mal.
Para programas sencillos, esta forma de creacin de los estados con los valores y la
ejecucin de ellos est muy bien. Sin embargo, los tipos de programas que tenemos
que tratar en el mundo real son mucho ms complejos. JDBC funcionar, si usted est
dispuesto y capaz de escribir y manejar una gran cantidad de cdigo no comercial.
Adems, el uso de JDBC podra plantear un reto cuando se tiene una gran cantidad de
tablas o relaciones complejas entre los objetos.
Improvisando la Aplicacin de la pelcula
No sera ideal para llamar a un mtodo como persisten ( ) en una clase de utilidad
para que el objeto de la pelcula se conserva en seguida?
Para lograr este objetivo, vamos a crear un objeto viejo y simple de Java (POJO) en
representacin de una pelcula. Para cada pelcula que se libera (o an no se ha
lanzado), tendremos un nuevo objeto de pelcula creado. La pelcula POJO se define
aqu:
public class Movie {
private int id = 0;
private String title = null;
private String synopsis = null;
private String director = null;
...
// Setters and getters omitted
}
Por lo tanto, todo lo que necesitamos ahora es que una instalacin de persistir este
objeto POJO en nuestra Tabla MOVIES en esencia de bases de datos que convierten el
modelo de objetos (objeto Pelcula) a un (fila de la tabla) modelo relacional.
Vamos a crear una clase MoviePersistor que podra hacer este trabajo:
// Pseudocode
public class MoviePersistor {
public void persist(Movie movie) {
// Persisting a movie goes here
}
public void fetch(String title) {
// Fetching a movie by title goes here
}
...
}
Cun genial es eso? Un POJO que representa una pelcula se conserva como una fila
de expedientes en un modelo de tabla a objetos de base de datos de modelo
relacional a travs de una clase de utilidad!
Eso es todo bien, excepto por el actual persisten a buscar implementaciones de
mtodo. Para implementar esta funcionalidad, no slo necesitamos la instalacin de la
conexin a una base de datos, tambin necesitamos un mecanismo para convertir el
objeto a una fila (como la cartografa de nuestras propiedades de objeto a las
columnas de base de datos).
Podramos escribir nuestro propio framework de clases para ocultar el meollo de estas
conversiones y mecanismos de persistencia (que pueden utilizar buenas declaraciones
JDBC detrs de las escenas). Aunque la redaccin de este framework no es ciencia de
cohetes, sera una prdida de tiempo y esfuerzo engorroso para empezar.
Con el tiempo, los requisitos de persistencia de una organizacin pueden cambiar o
incluso puede migrar la base de datos, por ejemplo, Oracle a MySQL. Esto significa
que el framework tendra que ser muy genrica y dar cuenta de una gran cantidad de
requisitos funcionales y tcnicos antes de golpear el suelo.
En mi experiencia, estos framework de cosecha propia son inmanejables, inflexible,
inescalable, y a veces fuera de fecha tambin! A menos que el requisito est apegado
especficamente a una organizacin (la organizacin puede querer persistir datos a
Marte!), Le recomiendo encarecidamente que usted busca en Internet para elegir uno
que satisfaga estrechamente nuestros predicados.
Pero antes de ir en su manera de empezar a escribir el cdigo, quiero ser el portador
de buenas noticias (si an no lo ha de haber escuchado esto): ya hay un gran
framework que hace exactamente esto, persistencia de objetos a una base de datos
relacional, llamado Hibernate!
Ahora que tenemos un framework de persistencia, vamos a ver cmo el mismo
mtodo que persiste nuestra pelcula se puede refactorizar travs de Hibernate:
public class BasicMovieManager {
private void persistMovie(Movie movie) {
Session session = sessionFactory.getCurrentSession();
...
session.save(movie);
}
...
}
Te diste cuenta de que nos ahorramos la instancia de la pelcula a una base de datos
por una ejecucin de una sola lnea de cdigo: Session.save (movie)? No es esto lo
que haba deseado antes, una clase que simplemente guardar los objetos persistentes
de una manera orientada a objetos? Las clases de la API de Hibernate exponen varios
mtodos para manipular los objetos Java con facilidad y comodidad. Nosotros no
tenemos que escribir pginas y pginas de cdigo utilizando JDBC ni doblar las
mangas y escribir un framework mientras se la pasa rascando la cabeza y tragar litros
de cafena!
Hibernate proporciona la capacidad de persistencia de objetos; Sin embargo, hay una
configuracin de una sola vez y el mapeo tenemos que dejar que Hibernate sabe
Este archivo tiene suficiente informacin para obtener una conexin en directo a una
base de datos MySQL. Las propiedades anteriores tambin se pueden expresar como
pares de nombre / valor. Por ejemplo, aqu est la misma informacin representada
como pares nombre / valor en un archivo de texto hibernate.properties tituladas:
hibernate.connection.driver_class = com.mysql.jdbc.Driver
hibernate.connection.url = jdbc:mysql://localhost:3307/JH
hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
El atributo d resource indica el nombre del recurso de mapeo que Hibernate debe cargar.
En este caso, Movie.hbm.xml es el archivo de asignacin y consta de detalles sobre
cmo un objeto de MOVIE se asigna a una Tabla MOVIE. Usted puede ver a los dems,
as, como Account.hbm.xml y Trade.hbm.xml. Vamos a ver estos archivos de
asignacin en un minuto. Qu hace Hibernate con este archivo de propiedades?
El framework Hibernate carga este archivo para crear un SessionFactory, que es una
caja fuerte clase de fbrica mundial de hilo para la creacin de Sesiones. Idealmente
Debemos crear un nico SessionFactory y compartirlo a travs de la aplicacin. Tenga
en cuenta que una SessionFactory se define por una, y slo una, la base de datos. Por
ejemplo, si usted tiene otra base de datos junto a MySQL, debe definir la configuracin
relevante en hibernate.hbm.xml crear una SessionFactory separado para esa base de
datos tambin.
El objetivo de la SessionFactory es crear objetos Session. Sesin es una puerta de
entrada a nuestra base de datos. Es el trabajo de la Sesin a cargo de todas las
operaciones de base de datos como el insertar, carga y recuperacin de los registros
de las tablas correspondientes. El framework tambin mantiene un medio
transaccional alrededor de nuestra aplicacin. Las operaciones que implican el acceso
a la base de datos estn envueltos en una sola unidad de trabajo llamada transaccin.
As, todas las operaciones en esa transaccin son ya sea exitosa o se deshace.
Tenga en cuenta que la configuracin se utiliza para crear una sesin a travs de una
instancia SessionFactory. Antes de continuar, tenga en cuenta que los objetos de
sesin no se thread-safe y por lo tanto no deben ser compartidos a travs de
diferentes clases. Vamos a ver los detalles de la forma en que deben utilizarse a
medida que avanzamos en este libro.
Crear definiciones de asignacin
Una vez que tenemos la configuracin de conexin lista, el siguiente paso es preparar
el archivo Movie.hbm.xml que consiste en las definiciones de mapeo objeto-tabla. El
siguiente fragmento de XML define el mapeo de nuestro objeto de pelcula contra la
Tabla MOVIES:
<hibernate-mapping>
<class name="com.madhusudhan.jh.domain.Movie" table="MOVIES">
<id name="id" column="ID">
<generator class="native"/>
</id>
<property name="title" column="TITLE"/>
<property name="director" column="DIRECTOR"/>
<property name="synopsis" column="SYNOPSIS"/>
</class>
</hibernate-mapping>
Los ajustes anteriores para inicializar la clase SessionFactory son para la versin ms
reciente de hibernate en el momento de escribir estas lneas, 4.2. La versin 4.x
Hibernate introdujo registros de servicio, que veremos en captulos posteriores.
En las versiones 3.x, el mtodo configure hurga a travs de la ruta de clases
buscando un archivo llamado hibernate.cfg.xml (o hibernate.properties) para
crear un objeto de configuracin. Este objeto de configuracin se utiliza para
crear una instancia de SessionFactory. Si est utilizando una versin pre-4.x
de Hibernate, utilice el siguiente cdigo para inicializar el SessionFactory:
//Creating SessionFactory using 3.x version of Hibernate
private void init3x(){
sessionFactory =
new Configuration().configure().buildSessionFactory();
}
Configuracin de Hibernate
La creacin de un proyecto de Hibernate es fcil. El proyecto que he preparado para
este libro es un cdigo basado en Maven desarrollado en NetBeans IDE. No voy a
entrar en detalles sobre la configuracin del entorno, pero los siguientes pasos debera
ayudarle. Aunque he utilizado NetBeans para el desarrollo de cdigo, puede utilizar
cualquiera de sus IDEs favoritos para trabajar en este proyecto. Tambin, usted puede
intercambiar MySQL con otras bases de datos, incluidos los de la memoria como Derby
o HyperSQL.
En primer lugar, debe configurar el entorno de desarrollo esencial consiste en JDK 5.0
y versiones posteriores, NetBeans IDE, Maven, y la base de datos MySQL (que puede
haber tenido este entorno ya!). He utilizado JDK 6, NetBeans 7.3, Maven 3.2 y MySQL
5.2 para desarrollar el cdigo y la versin Hibernate es 4.2.3.Final.
Una vez que tenga el entorno dev ordenados, el siguiente paso es crear un proyecto
Maven en NetBeans (o Eclipse). Aadir las dependencias de Hibernate apropiadas para
el archivo pom.xml como se muestra aqu:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.madhusudhan</groupId>
<artifactId>just-hibernate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.3.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
...
</project>
La mayora de las tablas de este proyecto fue auto generada por Hibernate; es decir,
Hibernate creara sobre la marcha (si no existen) mediante la lectura de la
configuracin. Tenemos que establecer una propiedad, hbm2ddl.auto, en el archivo de
configuracin de Hibernate (hibernacin cfg.xml.) Al valor apropiado para esta
generacin automtica a suceder, de la siguiente manera:
<property name="hbm2ddl.auto">update</property>
Resumen
En este captulo, aprendimos sobre el dominio del problema objeto-relacional-modelo
caminando a travs de un ejemplo. Aunque podemos utilizar JDBC para el acceso a
datos, se encontr que se requiere una gran cantidad de mapeo manual y cdigo
innecesariamente repetitivo. Nos tomamos un pequeo paso y present Hibernate
para resolver el problema de la persistencia objeto a relacional de datos. A partir de
un alto nivel, tomamos un vistazo a los conceptos de Hibernate SessionFactory y
Sesiones. Refactorizamos el ejemplo de JDBC para usar el framework de Hibernate y
con xito persisti y pregunt los POJOs como se esperaba. En el prximo captulo,
vamos a ir a travs de los fundamentos de la hibernacin en detalle.
java.sql.Connection;
java.sql.PreparedStatement;
java.sql.ResultSet;
java.sql.SQLException;
import cadillacs.beans.Movie;
public class JDBCexample {
public static OracleConnection conexionOracle = new OracleConnection();
public static Connection conn;
public static void main(String[] args) throws Exception {
// Conecction
conn = conexionOracle.getOracleConnection();
System.out.println("Conexion exitosa...");
// insert movie table:
Movie movie = new Movie();
movie.setIdMovie(1);
movie.setTitle("The Thing");
movie.setSynopsis("habia una vez...");
movie.setDirector("Pedrito Jr.");
// insertMovie(movie);
System.out.println("Se inserto registro exitosamente.");
// read (select)
queryMovies();
// update
// ...
// read (select)
// ...
// delete
// ...
conn.close();
}
System.out.println("Conexion cerrada.");
}
public static void insertMovie(Movie movie) throws SQLException {
PreparedStatement pst = conn
.prepareStatement("insert into movies (movies_id, title, director,
synopsis) values(movies_sequence.NEXTVAL,?,?,?)");
pst.setString(1, movie.getTitle());
pst.setString(2, movie.getDirector());
pst.setString(3, movie.getSynopsis());
pst.execute();
pst.close();
}
public static void getMovies(Movie movie) throws SQLException {
PreparedStatement pst = conn
.prepareStatement("insert into movies (movies_id, title, director,
synopsis) values(movies_sequence.NEXTVAL,?,?,?)");
pst.setString(1, movie.getTitle());
pst.setString(2, movie.getDirector());
pst.setString(3, movie.getSynopsis());
pst.execute();
pst.close();
}
}