Actualmente estoy trabajando en un proyecto personal, esto es prácticamente el inicio, y entre las tecnologías que elegí para el desarrollo está Java, por ello usaré JPA con Hibernate.
Java es una de las tecnologías que más me gustan pues la conocí desde la universidad, me pareció un lenguaje muy poderoso y versátil, si bien al principio me costó un poco entender el paradigma de la orientación a objetos ya entrados en tema le tomas el camino y no hay vuelta atrás, sobre todo para mí, que venía de un lenguaje como C.
Decidí usar Hibernate con JPA ya que en la universidad tuve una clase en la que nos enseñaron a crear algo como lo que hace esta implementación ahora, pero recuerdo que ni siquiera aprendí cómo se creaban, cómo funcionaban, ni para que servían, hace un par de años cuando comencé a trabajar un compañero de trabajo me pidió ayuda con un proyecto que teníamos en PHP con Symfony y usaba Doctrine, cuando llegué a la parte de las entidades me pareció increíble como en lugar de trabajar con Querys directo a la base de datos lo hacías desde estas entidades, pero había un detalle, nunca he sido fan de PHP, hasta que me enteré que en Java existía algo similar, Hibernate.
Hibernate es una implementación de JPA y nos facilita la comunicación con la base de datos, así en lugar de ver todo como una comunicación a través de Querys se puede ver como interacciones con objetos.
Hace algunos días comencé un proyecto y una parte que ya definí es la base de datos, por ello usaré JPA con Hibernate para mapear esta, la idea es hacer una entrega de más de un artículo para ejemplificar cómo quedaría un proyecto real, en esta entrega se muestra cómo se mapean dos de las tablas que componen la BD.
Tabla Products
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "products")
public class Product {
@Id
@Column(name = "product_id",nullable = false)
private Long productId;
@Column(name = "product_type_id")
private Long productTypeId;
private String name;
private String description;
@Column(name = "unit_price")
private Float unitPrice;
@Column(name = "public_price")
private Float publicPrice;
//Getters and setters
}
La tabla de producto básicamente almacenará los productos de la tienda, por eso se crea la clase Product (en inglés para irnos acostumbrando a que muchas cosas en el mundo de las TI son en ese idioma) y se le agrega la anotación @Entity
, cabe resaltar que se usa esta anotación por las convenciones para un mejor manejo e identificación de qué es cada cosa, de igual forma uso la anotación @Table
para indicar el nombre de la tabla en la base de datos, los nombres de las tablas deben ser en plural y las clases en singular.
Cada producto será identificado a través de su código de barras yo decidí llamarle Id por convención pues es su identificador, en una entidad es necesario indicar cuál será el identificador y resaltarlo con la anotación @Id
ya que de no hacerlo mostrará errores al compilar, además usé la anotación @Column para indicar el nombre que tendrá que en este caso es PRODUCT_ID
indicando además que el campo no puede ser nulo con la instrucción nullable = false
.
La anotación @Column
la utilicé también con productTypeId, unitPrice y publicPrice dado que en bases de datos me gusta tener los nombres de las tablas separados por guiones bajos entre cada palabra.
Los métodos get y set de cada propiedad van definidos en la parte de abajo.
Tabla Product_Types
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "product_types")
public class ProductType {
@Id
@Column(name = "product_type_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long productTypeId;
private String name;
private String description;
private Float utility;
@Column(name = "are_pieces")
private Boolean arePieces;
//Getters and setters
}
Para mapear esta tabla se usan las mismas anotaciones que con la tabla anterior salvo por una extra @GeneratedValue
, esta se agrega ya que nos permite generar el valor del identificador en forma de secuencia y así no tenemos que ingresar este valor al hacer una inserción, recordando que en PRODUCTS no se agregó esta anotación porque para hacer inserciones sí se debe ingresar su identificador.
Para la anotación @GeneratedValue
tenemos 4 opciones de estrategia a las que accedemos desde la clase estática GenerationType
, aunque se sugieren usar sólo dos, IDENTITY y SEQUENCE, esta última hace uso de una secuencia que previamente debemos definir en la base de datos que será la encargada de realizar la asignación de identificadores, mientras que yo uso la primera, esta utiliza la columna identity que provee la base de datos.
¡Y listo!
Ya tengo mapeadas dos de mis tablas a la base de datos, por ahí hay un pequeño detalle que tiene una de las clases, pero es un tema que más adelante tomaré, les dejo una pista, tiene que ver con la relación que guardan estas tablas en la base, nos leemos en la próxima entrega.