viernes, junio 03, 2011

Java - Aplicación Web, Hibernate con Spring Parte III - Entidades


"Si usa algún código del siguiente tutorial, den el icono de ME GUSTA del Facebook que se encuentra en su mano derecha, para que se vuelva Seguidor del Blog y también comentenos que tal les pareció el tutorial"

1. ENTORNO


  • MySQL 5.1.
  • NetBeans IDE 6.9.1
  • Apache Tomcat
  • JDK 1.6.0 - 21

2. INTRODUCCIÓN


Luego de haber configurado nuestro archivo applicationContext.xml en el capitulo dos de este tutorial,  debemos de mapear nuestras clases.

2.1. Mapeo

Mapeo consiste en representar cada tabla de la base de datos como una clase o un conjunto de clases. Y gracias a ello podemos seguir trabajando con Clases en Java sin preocuparnos de la base de datos. Y nos permitirá ademas cuando entre dos tablas existe integridad referencial, tendremos un clase que hace referencia a otra. Es por ese motivo que para que un proyecto en Hibernate tenga éxito se tiene que tener en cuenta un buen diseño de base de datos desde el inicio para no cambiar nuestras clases y volver hacer un re-mapeo de nuestras clases. Existe dos formas de realizar el mapeo
  • Usando un archivo de configuracion
  • Usando anotaciones
Yo por lo general uso el modelo anotaciones debido a que la configuración lo hacemos en la misma clase y no tendríamos que estar configurando a cada rato un archivo de configuración.

2.2. Entidad

Con el mapeo generamos clases que tienen la misma estructura de nuestra base de datos. A estas clases les llamamos entidades. La entidades serian clases con atributos propias de la tabla con sus respectiva equivalencia entre el tipo de dato de la base de datos con el tipo de dato en Java. Eso quiere decir si es un tabla XYZ tenemos la columna NOMBRE que es del tipo VARCHAR en Java tendríamos un atributo NOMBRE con el tipo de dato STRING. Pero como Java sabe que una clase es una entidad ??? Pues al inicio de la declaracion de la clase debemos de poner la anotacion @Entity que nos dice que nuestra clase es una entidad y ademas debemos de poner la notacion @Table(name=”Tabla”) para decir a que tabla hacer referencia nuestra clase. Por ejemplo


@Entity
@Table(name = "producto")
public class Producto implements Serializable {
....
....


Sobre el tema de mapeo y entidades en internet hay mucho material, les recomiendo el siguiente enlace y este otro para poder saber mas sobre el tema.

3. DESARROLLO


3.1. Creando nuestras entidades

Netbeans nos ayuda a generar nuestra entidades de forma automática, para crear nuestras entidades debemos de hacer clic derecho en nuestro paquete "com.hwongu.entity" y luego ir a la opción New-->Entity Class from Database. Si no le sale esta opción ir a New-->Other y buscar la opción "Entity Class from Database".














Y el formulario que nos sale es la de elegir nuestra conexión de base de datos que vamos a usar, si es que no tuviéramos nuestra base de datos en el combo deberíamos crear una nueva conexión a nuestra base de datos y para eso debemos de seleccionar la opción de "New Database Connection" y poner los parámetros de conexión con la base de datos.
















Al hacer eso no mostrar las tablas que tenemos en la base de datos a la cual nos hemos conectado y luego presionamos el botón de "Add All" para generar todas nuestras clases mapeadas con la base de datos.
















De ahí nos pedirá con que nombre queremos llamar a las clases que se generaran. Dejamos los nombres por defecto ya que es el estandar que se usa para el mapeo de las clases. También debemos de quitar el check en la opción que dice "Generate Name Query Annotations...", pero porque quitamos esta opcion ??? Si dejamos activada esta opcion, Netbans generia querys a su manera para consultar datos a nuestras tablas y les pondria un sinonimo para poder llamarlo desde un metodo, por ejemplo

"SelectAll" seria equivalente a decir "SELECT P FROM Producto P"

Y en lugar de ejecutar la siguiente sentencia

entityManager.createQuery("SELECT P FROM Producto P")

Solo bastaría con llamar al nombre equivalente del query anterior

entityManager.createNamedQuery("SelectAll ")

En ciertos casos es útil esta opción, pero se debe de dejar limpia la entidad y los querys ponerlo solo en la capa del DAO

















Después nos pedirá el modelo de carga de datos a usar o lo que comúnmente se le conoce como FETCH, En JPA hay dos tipos de carga de datos EAGER y LAZY. Pero cual es la diferencia ??? Para explicar la diferencia les pondré el siguiente caso, como ustedes vieron la tabla Venta de nuestro tutorial se relaciona con nuestra tabla DetalleVenta con un relación de uno a muchos, eso quiere decir que una Venta tienen muchos DetalleVenta. Cuando nosotros ponemos a una propiedad en el modo EAGER no traemos la información completa de los detalle de la venta desde la clase Venta de forma automática en cambio cuando ponemos en LAZY no lo trae en forma automática, teniendo que cambiar de cierta forma nuestro query para traer su información.
La opcion Collection Type quiere decir que las relaciones de uno a mucho como las va a traer. Por ejemplo si estoy en venta podría tener un List, Set de detalle de ventas.

















Y al final veremos nuestros entitys generados de forma automática.

9 comentarios:

sos grande maestro... aca un fiel alumno... saludos desde Costa Rica.

Muchas gracias por los saludos y por seguir a mi pagina :D

maestro una consulta...una aplicacion java de escritorio crea en linux, puede ser implementada en otros SO como windows o Mac sin problemas ???

No deberia haber problemas, excepto que en tu codigo en Java metas sentencias propias de un sistema operativo. Como por ejemplo poner el SKIN de windows XP en linux podria hacer que no corra.

Gracias por compartir sus conocimientos saludos desde Quito Ecuador

maestro y para cuando tendremos el desenlace de este curso...

Me gusta mucho como expresa sus conocimientos. MUCHAS GRACIAS... pero ¿Continuara?

Que excelente curso me agrada encotnrar tutoriales como estos ya que se aprende mucho.

Pero precisamente andaba buscando... la parte que sigue del proyecto!! la parte de Vista y manejo de formularios. Parece que tendré que seguir buscando.... jejeje