<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>jpa &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/jpa-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Tue, 10 Nov 2020 04:52:49 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.15</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>jpa &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Relaciónes @ManyToMany</title>
		<link>https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 27 Dec 2018 16:00:22 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2579</guid>

					<description><![CDATA[<p>Las relaciones Mucho a Muchos (@ManyToMany) se caracterízan por Entidades que están relacionadas con a muchos elementos de un tipo determinado, pero al mismo tiempo, estos últimos registros no son exclusivos de un registro en particular, si no que pueden ser parte de varios, por lo tanto, tenemos una Entidad A, la cual puede estar [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/">Relaciónes @ManyToMany</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-manytomany-1024x575.jpg" alt="" class="wp-image-2586"/></figure>



<p>Las relaciones Mucho a Muchos (@ManyToMany) se caracterízan por Entidades que están relacionadas con a muchos elementos de un tipo determinado, pero al mismo tiempo, estos últimos registros no son exclusivos de un registro en particular, si no que pueden ser parte de varios, por lo tanto, tenemos una Entidad A, la cual puede estar relacionada como muchos registros de la Entidad B, pero al mismo tiempo, la Entidad B puede pertenecer a varias instancias de la Entidad A.</p>



<span id="more-2579"></span>



<p>Algo muy importante a tomar en cuenta cuando trabajamos con relaciones <code>@ManyToMany</code>, es que en realidad este tipo de relaciones no existen físicamente en la base de datos, y en su lugar, es necesario crear una tabla intermedia que relaciones las dos Entidades, veremos más adelante como resolvemos eso.</p>



<p>Un ejemplo clásico de estas relaciones son los libros con sus autores, de esta forma, un libro puede tener varios autores, y a su vez, los autores puede tener muchos libros. Pero para que quede más claro, veamos como quedarían las Entidades de Autor (<code>Author</code>), Libro (<code>Book</code>):<br></p>



<p><br><strong>Entidad Book:</strong></p>



<pre class="wp-block-code"><code class="">package com.oscarblancarteblog;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name = "books")
public class Book {
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "NAME", nullable = false)
    private String name;
    
    @JoinTable(
        name = "rel_books_auths",
        joinColumns = @JoinColumn(name = "FK_BOOK", nullable = false),
        inverseJoinColumns = @JoinColumn(name="FK_AUTHOR", nullable = false)
    )
    @ManyToMany(cascade = CascadeType.ALL)
    private List&lt;Author> authors;
   
    public void addAuthor(Author author){
        if(this.authors == null){
            this.authors = new ArrayList&lt;>();
        }
        
        this.authors.add(author);
    }

    /** GET and SET */
  
}</code></pre>



<p>Como podemos apreciar, hemos creado una lista de tipo <code>Author</code>, la cual es anotada con <code>@ManyToMany</code>, adicional, hemos definido la anotación <code>@JoinTable</code>, la cual nos sirve para definir la estructura de la tabla intermedia que contendrá la relación entre los libros y los autores.</p>



<p>La anotación <code>@JoinTable</code> no es obligatoria en sí, ya que en caso de no definirse JPA asumirá el nombre de la tabla, columnas, longitud, etc. Para no quedar a merced de la implementación de JPA, siempre es recomendable definirla, así, tenemos el control total sobre ella.<br><br>Hemos definidos las siguientes propiedades de la anotación <code>@JoinTable</code>:<br></p>



<ul><li><strong>name</strong>: Nombre de la tabla que será creada físicamente en la base de datos.</li><li><strong>joinColumns</strong>: Corresponde al nombre para el ID de la Entidad Book.</li><li><strong>inverseJoinColumns</strong>: Corresponde al nombre para el ID de la Entidad Author</li></ul>



<p><br><strong>Entidad&nbsp;<code>Author</code>:</strong></p>



<pre class="wp-block-code"><code class="">package com.oscarblancarteblog;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name="authors")
public class Author {
    
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name="NAME", nullable = false)
    private String name;
    
    @ManyToMany(mappedBy = "authors")
    private List&lt;Book> books;

    /** GET and SET **/
}</code></pre>



<p>El caso de la Entidad <code>Author</code> es más simple, pues solo marcamos la colección con <code>@ManyToMany</code>, pero en este caso ya no es necesario definir la anotación <code>@JoinTable</code>, en su lugar, definimos la propiedad <code>mappedBy</code> para indicar la relación bidireccional y al mismo tiempo, JPA puede tomar la configuración del <code>@JoinTable</code> de Books.</p>



<p>Como resultado de estas Entidades, tendremos las siguientes tablas auto generadas:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/manytomany-tables.jpg" alt="" class="wp-image-2583"/></figure>



<p>Notemos en la tabla <em>authors </em>no tiene una columna que haga referencia a <em>books</em>, ni <em>books </em>a <em>authors</em>, si no que es necesario tener una tabla intermedia que haga el cruce entre las dos tablas. </p>



<p>La tabla intermedia (<em>rel_book_auths</em>) es generada por la anotación <code>@JoinTable</code> y sus dos columnas son llaves foraneas a las tablas <em>books</em> y <em>authors</em>.<br><br><br></p>



<h2>Prueba de validación</h2>



<p>Para comprobar que todo funciona como lo hemos dicho, vamos a realizar una prueba, la cual se ve de la siguiente manera:</p>



<pre class="wp-block-code"><code class="">public static void main(String[] args) {
        
	//Authors
	Author author1 = new Author();
	author1.setName("Juan Perez");
	
	Author author2 = new Author();
	author2.setName("Oscar Blancarte");
	
	Author author3 = new Author();
	author3.setName("Arturo Martinez");
	
	
	//Books
	Book book1 = new Book();
	book1.setName("El lago y el pato");
	book1.addAuthor(author1);
	book1.addAuthor(author2);
	book1.addAuthor(author3);
	
	Book book2 = new Book();
	book2.setName("Una mañana de verano");
	book2.addAuthor(author1);
	book2.addAuthor(author2);
	book2.addAuthor(author3);
	
	EntityManager em = EntityManagerUtil.getEntityManager();
	em.getTransaction().begin();
	em.persist(book1);
	em.persist(book2);
	em.getTransaction().commit();
	
	System.out.println("FIN");
}</code></pre>



<p>Hemos creados dos libros y tres autores, y luego hemos asociado a los autores a los libros, con la intención de que los autores estén en dos libros y los libros tengan varios autores.</p>



<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST,&nbsp;</strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener"><strong>https://codmind.com/courses/jpa</strong></a></p>



<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener"><img loading="lazy" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" alt="" class="wp-image-3085" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption>&nbsp;Los invito a mi&nbsp;<a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br></figcaption></figure>



<p>Ahora veamos como se ven las tablas <em>authors</em>, <em>books </em>y <em>rel_books_auths</em>:<br></p>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/authors-table-2.jpg" alt="" class="wp-image-2593"/></figure></div>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/book-table.jpg" alt="" class="wp-image-2592"/></figure></div>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/rel-books-auths-table.jpg" alt="" class="wp-image-2594"/></figure></div>



<p>Para poder obtener la relación entre libros y autores solo faltaría hacer la unión entre las dos tablas.<br><br></p>



<h2>Conclusiones</h2>



<p>Para concluir solo faltaría resaltar que en las relaciones <code>@ManyToMany</code> los registros son independientes de los registros a los que son relacionados, por lo que en este caso, podrían existir los autores si no existieran los libros, y al revés.</p>



<center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more disabled" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/">Siguiente </a></center>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/">Relaciónes @ManyToMany</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/feed/</wfw:commentRss>
			<slash:comments>54</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2579</post-id>	</item>
		<item>
		<title>Relaciones @OneToMany</title>
		<link>https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 16:00:27 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2555</guid>

					<description><![CDATA[<p>Las relaciones uno a muchos (@OneToMany) se caracterizan por Entidad donde tenemos un objeto principal y colección de objetos de otra Entidad relacionados directamente. Estas relaciones se definen mediante colecciones, pues tendremos una serie de objetos pertenecientes al objeto principal. Este articulo es parte de un guia completa de JPA, para ver el contenido completo [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/">Relaciones @OneToMany</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-onetomany-1024x575.jpg" alt="JPA relaciones @OneToMany" class="wp-image-2556"/></figure>



<p>Las relaciones uno a muchos (@OneToMany) se caracterizan por Entidad donde tenemos un objeto principal y  colección de objetos de otra Entidad relacionados directamente. Estas relaciones se definen mediante colecciones, pues tendremos una serie de objetos pertenecientes al objeto principal.<br><br></p>



<span id="more-2555"></span>



<blockquote class="wp-block-quote"><p>Este articulo es parte de un guia completa de JPA, para ver el contenido completo puedes ir a <a href="https://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Java Persistence API (JPA)</a></p></blockquote>



<p><br>Un ejemplo clásico para entender este tipo de relaciones son las facturas, pues tendremos una Entidad cabecera donde tengamos los datos principales de la factura, como podría ser serie, cliente, total, fecha de expedición, etc. Por otra parte, la factura tendrá una serie de líneas que representa cada uno de los productos vendidos.&nbsp;</p>



<p>Veamos como quedaría la entidad <code>Invoice</code> (factura):</p>



<pre class="wp-block-code"><code class="">package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name="INVOICES")
public class Invoice {
    
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "STATUS", length = 20, nullable = false)
    @Enumerated(EnumType.STRING)
    private Status status;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "REGIST_DATE", nullable = false)
    private Calendar registDate;
    
    @JoinColumn(name = "FK_CUSTOMER", nullable = false)
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Customer customer;
    
    @OneToOne(mappedBy = "invoice", cascade = CascadeType.ALL)
    private Payment payment;
    
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "invoice")
    private List&lt;InvoiceLine> lines;

    /** GET and SET */
}</code></pre>



<p><br>Podemos apreciar como hemos definido la propiedad lines como una lista (<code>List</code>), lo cual nos permite relacionar la factura con un número indeterminado de líneas, por otro lado, hemos definido la propiedad <code>mappedBy</code> para indicar que es una relación bidireccional, es decir, la Entidad <code>InvoiceLine</code> tendrá también una relación hacia la Entidad <code>Invoice</code>.</p>



<p>La Entidad <code>InvoiceLine</code> se verá de la siguiente manera:</p>



<pre class="wp-block-code"><code class="">package com.obb.jpa.jpaturorial.entity;

import javax.persistence.*;

@Entity
@Table(name = "invoice_lines")
public class InvoiceLine {
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(name = "PRODUCT", nullable = false)
    private String product;
    
    @Column(name = "PRICE", nullable = false)
    private double price;
    
    @Column(name = "TOTAL", nullable = false)
    private double quantity;
    
    @ManyToOne
    @JoinColumn(name = "FK_INVOICE", nullable = false, updatable = false)
    private Invoice invoice;
    
    /** GET and SET */

}</code></pre>



<p><br>Como dijimos hace un momento, la Entidad <code>InvoiceLine</code> tiene una propiedad de tipo <code>Invoice</code> para poderla hacer bidireccional, observemos que el nombre de la propiedad <code>invoice</code> corresponde con el valor del <code>mappedBy</code> definido en la Entidad <code>Invoice</code>, ya que de lo contrario JPA nos arrojará un error.</p>



<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST,&nbsp;</strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener"><strong>https://codmind.com/courses/jpa</strong></a></p>



<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener"><img loading="lazy" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" alt="" class="wp-image-3085" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption>&nbsp;Los invito a mi&nbsp;<a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br></figcaption></figure>



<p><br>En este imagen podemos apreciar que la tabla <em>invoice_lines</em> tiene la columna <em>FK_INVOICE</em> que será utilizada para realizar el <em>JOIN</em> con la tabla <em>invoices</em>, de tal forma que cada registro de <em>invoice_lines</em> que sea encontrado será convertido en una instancia de la Entidad <code>InvoiceLine</code>.</p>



<pre class="wp-block-code"><code class="">public static void main(String[] args) {
    Invoice invoice = new Invoice();

    List&lt;InvoiceLine> lines = new ArrayList&lt;>();
    for(int c = 0; c&lt;10; c++){
        InvoiceLine line = new InvoiceLine();
        line.setInvoice(invoice);
        line.setPrice(10);
        line.setProduct("Product " + (c+1));
        line.setQuantity(c+1);
        lines.add(line);
    }

    Customer customer = new Customer();
    customer.setName("Oscar Blancarte");

    invoice.setCustomer(customer);
    invoice.setLines(lines);
    invoice.setRegistDate(Calendar.getInstance());
    invoice.setStatus(Status.ACTIVE);

    EntityManager em = EntityManagerUtil.getEntityManager();
    em.getTransaction().begin();
    em.persist(invoice);
    em.getTransaction().commit();
}</code></pre>



<p><br>Dando como resultado los siguientes registros en la base de datos:</p>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoices-select-1.jpg" alt="JPA relaciones @OneToMany tabla invoices" class="wp-image-2558"/><figcaption>Tabla invoices</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoice-lines-select.jpg" alt="JPA relaciones @OneToMany tabla invoice_lines" class="wp-image-2559"/><figcaption>Tabla invoice_lines</figcaption></figure></div>



<p>Ahora si podemos ver todo materializado y nos queda más la forma en que la información es almacenada.&nbsp;<br><br><br></p>



<h2>Conclusiones</h2>



<p>Hemos comprobado lo simple que es crear relaciones <code>@OneToMany</code> y hemos podido comprobar como&nbsp; la información es almacenada, solo faltaría resaltar que JPA no garantiza el orden en que los elementos de la colección son insertados, es por ello, que siempre se aconseja tener una columna que indique el orden natural de los elementos para sobre esa columna hacer el ordenamiento, esto claro si nos interesa mantener el ordenamiento, en caso podemos ignorarlo.</p>



<center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/14/relaciones-onetoone/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/">Siguiente </a></center>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/">Relaciones @OneToMany</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2555</post-id>	</item>
		<item>
		<title>Path params con @PathParam</title>
		<link>https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 17 Dec 2018 16:00:30 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2515</guid>

					<description><![CDATA[<p>Por increíble que parezca, en REST la URL puede proporcionar una de las principales fuentes de información para los servicios, pues es posible definir como parámetros de entrada ciertas parte de la URL, lo que nos permite en primer lugar, crear métodos especiales para atender ciertas URL, pero por otra parte, esos fragmentos de URL [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/">Path params con @PathParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jaxrs-pathparams-1024x575.jpg" alt="JAX-RS Path params con @PathParams" class="wp-image-2522"/></figure>



<p>Por increíble que parezca, en REST la URL puede proporcionar una de las principales fuentes de información para los servicios, pues es posible definir como parámetros de entrada ciertas parte de la URL, lo que nos permite en primer lugar, crear métodos especiales para atender ciertas URL, pero por otra parte, esos fragmentos de URL pueden ser inyectados como parámetros a los métodos Java.<br><br></p>



<span id="more-2515"></span>



<blockquote class="wp-block-quote is-style-default"><p>NOTA: Este artículo pertenece a una guia completa para aprender a crear un API REST con el API de JAX-RS de Java, ve el <a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">índice completo</a> aquí.</p><p></p></blockquote>



<p><br>Hace unos días escribía sobre la forma de escribir los Path y como podemos como podemos podíamos definir parámetros con la anotación <code>@Path</code>, puede regresara a la sección <a href="https://www.oscarblancarteblog.com/2018/12/11/introduccion-a-las-url-path/">Introducción a las URL con @Path</a> si quieres tener un poco más de contexto sobre lo que estaremos hablando esta sección.<br><br></p>



<h2>Definiendo un Path Param</h2>



<p>No vamos a entrar en mucho detalle sobre como definir un parámetro desde <code>@Path</code> pues ya lo explicamos en una sección pasado, pero si repasaremos como se hacia.&nbsp;<br></p>



<pre class="wp-block-code"><code>@GET
@Path("/users/{userId}")
public Response findUserById(long userId) {}</code></pre>



<p><br>Como podemos apreciar en el fragmento de código anterior, es posible definir ciertas secciones de una URL como parámetros, encerrando entre llaves (<code>{userId}</code>) la parte que queremos recuperar como parámetro desde Java.&nbsp;<br><br></p>



<h2>Recuperar una Path Param con @PathParam</h2>



<p>Ya que hemos definido todas secciones de parámetros dentro del <code>@Path</code>, lo que seguirá es recuperarlos desde el método Java para poderlos utilizar, para ello, debemos de establecer la anotación <code>@PathParam</code> en cada uno de los parámetros del método Java sobre el cual queremos inyectar el valor.</p>



<pre class="wp-block-code"><code>@GET
@Path("/users/{userId}")
public Response findUserById(@PathParam("userId") long user) {
    System.out.println("UserID ==> " + user);
}</code></pre>



<p><br>En el fragmento de código anterior, podemos apreciar como hemos establecido la anotación <code>@PathParam</code> para el parámetro <code>user</code>, el cual será inyectado con el valor del parámetro <code>userId</code> del <code>@Path</code>.<br><br></p>



<h2>Recuperar un Path param mediante UriInfo</h2>



<p>La segunda forma de recuperar un Path param es mediante la interface <code>UriInfo</code>, la cual es una interface que contiene todos los metadatos relacionados con la URL. Al ser una interface no puede ser instanciada, por lo que deberá ser inyectada para ser utilizada, vamos como sería:</p>



<pre class="wp-block-code"><code>@GET
@Path("uriInfo/{param1}")
public Response getUriInfo(@Context UriInfo uriInfo) {
    String param1 = uriInfo.getPathParameters().getFirst("param1");
    return Response.ok(param1).build();
}</code></pre>



<p><br>La interface <code>UriInfo</code> proporciona el método <code>getPathParameters</code> que retorna una subclase de la interface <code>java.util.Map</code> con todos los parámetros, por lo que podemos iterar el nombre de los parámetros y sus valores, o podemos buscar directamente el valor de un parámetro mediante el método <code>getFist</code>.&nbsp;<br>Al ejecutar el método anterior deberíamos tener como resultado el valor del parámetro <code>param1</code>, vamos el resultado:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test.jpg" alt="" class="wp-image-2523"/></figure>



<h2>Conclusiones</h2>



<p>Los Path params son indispensables para definir de forma clara los recursos de tu API, pues evita tener que agregar parámetros de tipo Query, los cuales hacen que las URL sean complejas y difíciles de recordar, ademas de que no son agradables para SEO.<br><br><br></p>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/">Path params con @PathParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2515</post-id>	</item>
		<item>
		<title>Personalizar las relaciones con @JoinColumn</title>
		<link>https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 13 Dec 2018 16:00:49 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Patrones de Diseño]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2469</guid>

					<description><![CDATA[<p>Mediante la anotación @JoinColumn es posible personalizar las columnas que será utilizadas como uniones con otras tablas. Cuando trabajamos con relaciones como @ManyToOne o @OneToOne, es necesario indicarle a JPA como es que tendrá que realizar la unión (JOIN) con la otra Entidad.   Nota: Este artículo pertenece a un tutorial completo de JPA, el [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/">Personalizar las relaciones con @JoinColumn</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter size-large wp-image-2477" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-joincolumn-1024x575.jpg" alt="JPA anotación @JoinColumn" width="648" height="364" />Mediante la anotación @JoinColumn es posible personalizar las columnas que será utilizadas como uniones con otras tablas. Cuando trabajamos con relaciones como @ManyToOne o @OneToOne, es necesario indicarle a JPA como es que tendrá que realizar la unión (JOIN) con la otra Entidad.<span id="more-2469"></span></p>
<p> </p>
<blockquote>
<p>Nota: Este artículo pertenece a un tutorial completo de JPA, el cual puedes <a href="https://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">ver aquí</a>.</p>
</blockquote>
<p> </p>
<p>La anotación <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  se puede llegar a confundir con <span class="lang:default decode:true crayon-inline ">@Column</span> , sin embargo, tiene una funcionalidad diferente, <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  se utiliza para marcar una propiedad la cual requiere de un JOIN para poder accederlas, mientas que <span class="lang:default decode:true crayon-inline ">@Column</span>  se utiliza para representar columnas simples que no están relacionadas con otra Entidad. A pesar de que se utiliza para cosas distintas, la realidad es que se parecen muchísimo, pues tiene casi las mismas propiedades, por que podríamos decir que <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  es el equivalente de <span class="lang:default decode:true crayon-inline ">@Column</span>  cuando utilizamos relaciones con Entidades.</p>
<p> </p>
<p>En la entrada pasada de este tutorial explicamos el caso de la Entidad Factura (<span class="lang:default decode:true crayon-inline ">Invoice</span> ) y Cliente (<span class="lang:default decode:true crayon-inline ">Customer</span> ), donde dijimos que toda factura está relacionada a un cliente, y utilizamos la anotación <span class="lang:default decode:true crayon-inline ">@ManyToOne</span>  para crear la relación, recordemos como quedaron estas Entidades:</p>
<pre class="lang:java decode:true" title="Invoice.java">package com.obb.jpa.jpaturorial.entity;
 
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
 
@Entity
@Table(name="INVOICES")
public class Invoice {
    
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "STATUS", length = 20, nullable = false)
    @Enumerated(EnumType.STRING)
    private Status status;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "REGIST_DATE", nullable = false)
    private Calendar registDate;
    
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Customer customer;
 
    /** GET and SET */
}</pre>
<p> </p>
<p>Entidad Customer:</p>
<pre class="lang:java decode:true" title="Customer.java">package com.obb.jpa.jpaturorial.entity;
 
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 = "CUSTOMERS")
public class Customer {
    
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "NAME", nullable = false, length = 100)
    private String name;
 
    /** GET and SET */
}</pre>
<p> </p>
<p>Podemos ver claramente que la Entidad <span class="lang:default decode:true crayon-inline ">Invoice</span>  tiene una relación <span class="lang:default decode:true crayon-inline ">@ManyToOne</span>  con la Entidad <span class="lang:default decode:true crayon-inline ">Customer</span> , esto le indica a JPA que requerirá hacer un <em>JOIN</em> para poder recuperar al Cliente, sin embargo, no hemos definido la anotación <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  y aun así trabaja, ¿cómo es esto posible?</p>
<p>Para comprender esto mejor, será necesario ver como JPA auto creo las tablas al momento de crear el schema, veamos las tablas generadas:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/diagrama-db.jpg" alt="JPA ManyToOne tables" width="649" height="271" /></p>
<p> </p>
<p>Podemos ver claramente que JPA creo la columna <em>CUSTOMER_ID</em> en la tabla <em>invoices</em>, pero no solo eso, si no que además, creo por nosotros la llave foránea, esto nos puede hacer pensar que la anotación <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  no es necesaria, y pueda que tengas razón, sin embargo, no utilizarla nos dejará a merced de como JPA genere la columna y como realice el JOIN con la tabla de empleados, lo cual será un verdadero problema si el Schema ya existe, pues muy probablemente la consulta falle al buscar la columna con un nombre diferente del que JPA asumiría.</p>
<p> </p>
<p>Ahora bien, con <span class="lang:default decode:true crayon-inline ">@JoinColumn</span> , podría definir el nombre exacto de la columna, si admite nulos, si es actualizable, insertable, indicar si queremos que genere o no la llave foránea o incluso, podríamos decirle sobre que Tabla debe generar el Join. Mejor veamos como quedaría la Entidad <span class="lang:default decode:true crayon-inline ">Invoice</span>  utilizando la anotación <span class="lang:default decode:true crayon-inline ">@JoinColumn</span> :</p>
<pre class="lang:java decode:true " title="Invoice.java">package com.obb.jpa.jpaturorial.entity;
 
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
 
@Entity
@Table(name="INVOICES")
public class Invoice {
    
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "STATUS", length = 20, nullable = false)
    @Enumerated(EnumType.STRING)
    private Status status;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "REGIST_DATE", nullable = false)
    private Calendar registDate;
    
    @JoinColumn(name = "fk_customer", nullable = false)
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Customer customer;
 
    /** GET and SET */
}</pre>
<p> </p>
<p>Ahora veamos como quedaría la nueva tabla <em>invoices</em>:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2474" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/tables.jpg" alt="" width="552" height="237" /></p>
<p>En esta segunda tabla ya vemos que ha cambiado el nombre de la columna, adicional se ha creado el constraint para no permitir valores nulos, aun que esto último no se pueda ver en la imagen.</p>
<p> </p>
<h2>Propiedades de @JoinColumn</h2>
<p>Ahora pasemos a analizar las propiedades que nos brinda <span class="lang:default decode:true crayon-inline ">@JoinColumn</span> :</p>
<ul>
<li><strong>name</strong>: Indica el nombre con el que se deberá de crear la columna dentro de la tabla.</li>
<li><strong>referencedColumnName</strong>: Se utiliza para indicar sobre que columna se realizará el Join de la otra tabla. Por lo general no se suele utilizar, pues JPA asume que la columna es el ID de la Entidad objetivo.</li>
<li><strong>unique</strong>: Crea un constraints en la tabla para impedir valores duplicados (default false).</li>
<li><strong>nullable</strong>: Crea un constraints en la tabla para impedir valores nulos (default true).</li>
<li><strong>insertable</strong>: Le indica a JPA si este valor deberá guardarse en la operación de inserción (default true)</li>
<li><strong>updatable</strong>: Le indica a JPA si el valor deberá actualizarse durante el proceso de actualización (default true)</li>
<li><strong>columnDefinition</strong>: Esta propiedad es utiliza para indicar la instrucción SQL que se deberá utilizar la crear la columna en la base de datos. Esta nos ayuda a definir exactamente como se creará la columna sin depender de la configuración de JPA.</li>
<li><strong>table</strong>: Le indicamos sobre que tabla deberá realizar el JOIN, normalmente no es utilizada, pues JPA asume la tabla por medio de la entidad objetivo.</li>
<li><strong>foreignKey</strong>: Le indica a JPA si debe de crear el Foreign Key, esta propiedad recibe uno de los siguientes valores <span class="lang:default decode:true crayon-inline ">CONSTRAINT</span> , <span class="lang:default decode:true crayon-inline ">NO_CONSTRAINT</span> , <span class="lang:default decode:true crayon-inline">PROVIDER_DEFAULT</span>  definidos en la enumeración <span class="lang:default decode:true crayon-inline ">javax.persistence.ForeignKey</span> .</li>
</ul>
<p> </p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a>
<figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption>
</figure>
<p> </p>
<h2>Conclusiones</h2>
<p>Hemos podido analizar como es que JPA se apoya de <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  para permitirle al programador personalizar cada aspecto de la columna de unión, lo cual es bastante bueno para poder respetar los estándares o nomenclaturas que usamos en nuestra empresa o proyecto. Como recomendación, yo siempre insisto en definir estas anotaciones, pues no es conveniente quedarnos a merced de la implementación de JPA para que defina como crear nuestras columnas.</p>
<p> </p>


<center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/14/relaciones-onetoone/">Siguiente </a></center>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/">Personalizar las relaciones con @JoinColumn</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2469</post-id>	</item>
		<item>
		<title>Relación muchos a uno con @ManyToOne</title>
		<link>https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 06 Dec 2018 18:30:22 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2449</guid>

					<description><![CDATA[<p>Una de las grandes ventajas que tiene trabajar con JPA, es que te permite hacer relaciones con otras entidades, de esta forma, es posible agregar otras Entidades como atributos de clase y JPA se encargará de realizar el SELECT adicional para cargar esas Entidades.   Para comprender esto, analicemos el ejemplo de las facturas, estas [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/">Relación muchos a uno con @ManyToOne</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter wp-image-2458 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-manytoone-1024x575.jpg" alt="Relación muchos a uno con @ManyToOne" width="648" height="364" />Una de las grandes ventajas que tiene trabajar con JPA, es que te permite hacer relaciones con otras entidades, de esta forma, es posible agregar otras Entidades como atributos de clase y JPA se encargará de realizar el SELECT adicional para cargar esas Entidades.<span id="more-2449"></span></p>
<p> </p>
<p>Para comprender esto, analicemos el ejemplo de las facturas, estas siempre son emitidas a un cliente, por lo que el objeto Factura siempre deberá tener una propiedad que represente al cliente. Normalmente, esta propiedad seria el ID, sin embargo, JPA nos permite tener una referencia a la Entidad cliente. Veamos cómo quedaría la Entidad <span class="lang:default decode:true crayon-inline ">Invoice</span>  (factura)</p>
<pre class="lang:java decode:true " title="Invoice.java">package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="INVOICES")
public class Invoice {
    
    @Id
    @Column(name="ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "STATUS", length = 20, nullable = false)
    @Enumerated(EnumType.STRING)
    private Status status;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "REGIST_DATE", nullable = false)
    private Calendar registDate;
    
    @ManyToOne(optional = false, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Customer customer;

    /** GET and SET */
}</pre>
<p> </p>
<p>Como podemos apreciar, hemos utiliza la anotación <span class="lang:default decode:true crayon-inline ">@ManyToOne</span> , la cual nos permite mapear una entidad con otra. Como única regla, es necesario la clase que sea una entidad, es decir, que también esté anotada con <span class="lang:default decode:true crayon-inline ">@Entity</span> .</p>
<p> </p>
<p>Por otro lado, tenemos la entidad <span class="lang:default decode:true crayon-inline ">Customer</span> , la cual se ve de la siguiente manera:</p>
<pre class="lang:java decode:true" title="Customer.java">package com.obb.jpa.jpaturorial.entity;

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 = "CUSTOMERS")
public class Customer {
    
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "NAME", nullable = false, length = 100)
    private String name;

    /** GET and SET */
}</pre>
<p> </p>
<p>Estas dos entidades nos crearán las siguientes tablas:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/diagrama-db.jpg" alt="JPA ManyToOne tables" width="649" height="271" /></p>
<p> </p>
<p>La anotación @ManyToOne cuenta con los siguientes atributos:</p>
<ul>
<li><strong>Optional</strong>: indica si la relación es opcional, es decir, si el objeto puede ser null. Esta propiedad se utiliza optimizar las consultas. Si JPA sabe que una relación es opcional, entonces puede realizar un <span class="lang:default decode:true crayon-inline ">RIGHT JOIN</span>  o realizar la consulta por separado, mientras que, si no es opcional, puede realizar un <span class="lang:default decode:true crayon-inline ">INNER JOIN</span>  para realizar una solo consulta.</li>
<li><strong>Cascade</strong>: Esta propiedad le indica que operaciones en cascada puede realizar con la Entidad relacionada, los valores posibles son <span class="lang:default decode:true crayon-inline ">ALL</span> , <span class="lang:default decode:true crayon-inline ">PERSIST</span> , <span class="lang:default decode:true crayon-inline ">MERGE</span> , <span class="lang:default decode:true crayon-inline ">REMOVE</span> , <span class="lang:default decode:true crayon-inline ">REFRESH</span> , <span class="lang:default decode:true crayon-inline">DETACH</span> y están definidos en la enumeración <span class="lang:default decode:true crayon-inline ">javax.persistence.CascadeType</span> .</li>
<li><strong>Fetch</strong>: Esta propiedad se utiliza para determinar cómo debe ser cargada la entidad, los valores están definidos en la enumeración <span class="lang:default decode:true crayon-inline ">javax.persistence.FetchType</span>  y los valores posibles son:
<ul>
<li><strong>EAGER</strong> (ansioso): Indica que la relación debe de ser cargada al momento de cargar la entidad.</li>
<li><strong>LAZY</strong> (perezoso): Indica que la relación solo se cargará cuando la propiedad sea leída por primera vez.</li>
</ul>
</li>
<li><strong>targetEntity</strong>: Esta propiedad recibe una clase (<span class="lang:default decode:true crayon-inline ">Class</span> ) la cual corresponde a la clase de la relación. No suele ser utilizada, pues JPA puede inferir la clase por el tipo de la propiedad.</li>
</ul>
<p>En nuestro caso, hemos definido la propiedad <strong>optional</strong> en false, pues toda factura debe de tener forzosamente un Cliente (customer). La propiedad <strong>cascade</strong> la definimos en <span class="lang:default decode:true crayon-inline ">ALL</span>  para facilitarnos la explicación de este ejemplo, pero más adelante en este tutorial analizaremos las cascadas en profundidad. La propiedad <strong>fetch</strong> la definimos en <span class="lang:default decode:true crayon-inline ">EAGER</span> , aun que para este tipo de relación es su valor por default y no sería necesario definirlo.</p>
<p> </p>
<h2>Ejemplo práctico</h2>
<p>Crearemos un pequeño ejemplo que nos permita comprobar cómo trabajar con esta relación, para ello, crearemos una nueva factura con un cliente:</p>
<pre class="lang:java decode:true">public static void main(String[] args) {
    EntityManager manager = EntityManagerUtil.getEntityManager();
        
    Customer customer = new Customer();
    customer.setName("ACME Corp");
      
    Invoice invoice = new Invoice();
    invoice.setCustomer(customer);
    invoice.setRegistDate(Calendar.getInstance());
    invoice.setStatus(Status.ACTIVE);
        
    manager.getTransaction().begin();
    manager.persist(invoice);
    manager.getTransaction().commit();
}</pre>
<p> </p>
<p>Como resultado, podemos observar como han sido insertados la Factura y el Cliente:</p>
<figure id="attachment_2452" aria-describedby="caption-attachment-2452" style="width: 342px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2452 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoices-select.jpg" alt="JPA Invoices ManyToOne relationship" width="342" height="179" /><figcaption id="caption-attachment-2452" class="wp-caption-text">Tabla de las facturas</figcaption></figure>
<figure id="attachment_2451" aria-describedby="caption-attachment-2451" style="width: 296px" class="wp-caption aligncenter"><img loading="lazy" class="wp-image-2451 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/customers-select.jpg" alt="JPA Customers ManyToOne relationship" width="296" height="177" /><figcaption id="caption-attachment-2451" class="wp-caption-text">Tabla de los clientes</figcaption></figure>
<p>Por otra parte, si consultamos la Entidad Invoice, JPA se encargará de cargar al Empleado, vamos el siguiente ejemplo:</p>
<pre class="lang:java decode:true">public static void main(String[] args) {
    EntityManager manager = EntityManagerUtil.getEntityManager();
    Invoice invoice = manager.find(Invoice.class, 1L);
        
    System.out.println("Invoice ID &gt; " + invoice.getId());
    System.out.println("Customer ID &gt; " + invoice.getCustomer().getId());
    System.out.println("Customer Name &gt; " + invoice.getCustomer().getName());
}</pre>
<p> </p>
<p>Como podemos apreciar en la siguiente imagen, no fue necesario ir a consultar el Cliente por separado, si no que JPA se encarga de recuperarlo justo en el momento en que lo necesitamos.</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2453" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/manytoone-select.jpg" alt="JPA ManyToOne select" width="332" height="81" /></p>
<p> </p>
<p>Finalmente, podemos ver en las siguiente imágenes como es que nos auto genero la tabla de las facturas, en ella podemos apreciar el campo <span class="lang:default decode:true crayon-inline ">CUSTOMER_ID</span> , el cual es en realidad una llave foránea a la tabla de clientes:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2454" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/table-sstructure.png" alt="JPA ManyToOne table" width="784" height="239" /></p>
<p> </p>
<p>JPA también nos ayuda a crear los Foreign Keys con la tabla de Clientes:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2455" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/table-keys.png" alt="JPA ManyToOne foreign keys" width="383" height="59" /></p>
<p> </p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a>
<figcaption>Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.</figcaption>
</figure>
<p> </p>
<h2>Conclusiones</h2>
<p>Hemos podido observar como JPA se encarga de todo lo relacionado a persistir o recuperar el cliente de la base de datos, sin embargo, hay algo que no hemos cubierto, y es la forma en que podemos personalizar la columna, es decir, como podemos indicarle el nombre, si admite nulos o no, etc. Todas esta propiedades las podremos definir en la anotación <span class="lang:default decode:true crayon-inline ">@JoinColumn</span>  que analizaremos en la siguiente parte del tutorial</p>
<p> </p>


<center><a class="btn btn-default read-more " style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more " style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/	">Siguiente </a></center>



<div style="height:87px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/">Relación muchos a uno con @ManyToOne</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2449</post-id>	</item>
		<item>
		<title>Introducción a Java Transaction API(JTA)</title>
		<link>https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 20 Dec 2016 09:00:56 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1316</guid>

					<description><![CDATA[<p>JTA o Java Transaction API es la encarga de administrar las transacciones del lado del servidor, abstrayendo casi en su totalidad al programador de abrir o cerrar las transacciones, de esta forma el programador únicamente se preocupa por la lógica de negocio aumentando drásticamente la productividad y los errores de Runtime. &#160; JTA es sin duda [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/">Introducción a Java Transaction API(JTA)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter size-full wp-image-1513" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/Guia_JPA_JTA.jpg" alt="Guia de JPA-JTA" width="744" height="417" />JTA o Java Transaction API es la encarga de <strong>administrar las transacciones</strong> del lado del servidor, abstrayendo casi en su totalidad al programador de abrir o cerrar las transacciones, de esta forma el programador únicamente se preocupa por la lógica de negocio aumentando drásticamente la productividad y los errores de Runtime.<span id="more-1316"></span></p>
<p>&nbsp;</p>
<p>JTA es sin duda unas de las API menos conocidas del Estándar de Java, pues si funcionamiento es abstraído casi en la totalidad por el Application Server, sin embargo, no puedo hacer todo el solo, y es necesario conocer cómo funciona y como indicarle a JTA como trabajar con las tracciones.</p>
<p>&nbsp;</p>
<p style="text-align: left;">Lo primero que debemos de saber es que JTA trabajo de la mano con los Enterprise Java Beans (EJB) a partir de la versión 3.0, mediante la unión de EJB + JPA + JTA, es posible crear componentes de negocio súper potentes y lo más interesantes, totalmente transaccionales. Esto quiere decir que todas las operaciones que realicemos en la invocación de un EJB queda envuelto es una transacción, sin importar cuantos EJB se ejecuten en la misma invocación o en varías. Te recomiendo repasar la sección anterior, <a href="https://www.oscarblancarteblog.com/2017/02/21/entitymanager-persistencecontext/">EntityManager &amp; PersistenceContext</a> ya que te pondrá un poco en contexto sobre los Transaction-Scope.</p>
<p>&nbsp;</p>
<p>En la imagen anterior podemos apreciar cómo es que JTA administra las transacciones. El cliente invoca un servicio de negocio, antes de que el Application Server inicie la ejecución del EJB, este abre una transacción, seguido se ejecuta una serie de EJB los cuales pueden hacer múltiples operaciones sobre la base de datos. Cuando la ejecución de todo el flujo termina, el Servidor realiza un Commit y regresa los resultados al cliente.</p>
<p>&nbsp;</p>
<p>Cabe mencionar que lo explicaremos a continuación requiere de conocimientos previos de EJB, pues JTA se integra junto con JPA para crear una amalgama perfecta, donde es difícil entender dónde empieza uno y termina el otro. Además, esta no es una guía de EJB por lo que nos detendremos en explicar la teoría de EJB.</p>
<p>&nbsp;</p>
<h2>Java Transaction API (JTA)</h2>
<p>&nbsp;</p>
<p>Antes de empezar debemos de dejas claro que JTA solo funciona en ambientes de Java EE, pues es el Application Server quien administra las transacciones a través de JPA. En la siguiente sección hablaremos de cómo administrar las transacciones en Ambientes Java SE, por lo que por ahora lo dejaremos hasta aquí. Para configurar JPA para que utilice JPA, tendremos que regresar al archivo <a href="https://www.oscarblancarteblog.com/2016/10/26/entitymanager-archivo-persistence-xml/">persistence.xml</a> y ajustar la línea:</p>
<p style="text-align: justify;"><span class="lang:xhtml decode:true crayon-inline">&lt;persistence-unit name=&#8221;JPA_PU&#8221; transaction-type=&#8221;JTA&#8221;&gt;</span></p>
<p>Si bien JTA administrara las transacciones es importante decirle como, es por eso que aquí entra en juego la anotación <span class="lang:java decode:true crayon-inline">@TransactionAttribute</span> , la cual pude ser declarada en cada método de negocio o a nivel de clase. Existen 6 posibles valores, los cuales harán que el EJB Container funcione de forma diferente. Los valores son los siguientes:</p>
<p>&nbsp;</p>
<ul>
<li><strong>NOT_SUPPORTED:</strong> Indica que la operación no soporta transacciones, por lo que, si el método es ejecutado dentro de una transacción, esta se suspende durante la ejecución del método y se restaura una vez finalizado, por lo que todos los cambios realizados en estos métodos no serán persistentes.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1515" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-NOT_SUPPORTED.png" alt="JPA-NOT_SUPPORTED" width="578" height="279" /></p>
<ul>
<li><strong>SUPPORTS:</strong> Indica que el método soporta transacciones, por lo que sí es ejecutado dentro de una transacción, este se unirá a la misma. Por otro lado, si es ejecutado fuera de una transacción este no creara ninguna transacción y todos los cambios realizados no se persistirán.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1516" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-SUPPORT.png" alt="JTA-SUPPORT" width="576" height="432" /></p>
<ul>
<li><strong>REQUIRES_NEW:</strong> Indica que el método requiere forzosamente una nueva transacción para funcionar, por lo que se creará una nueva transacción independientemente de si es ejecutado dentro o fuera de una transacción existente.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1517" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-REQUIRES_NEW.png" alt="JTA-REQUIRES_NEW" width="581" height="436" /></p>
<ul>
<li><strong>MANDATORY:</strong> Estas operaciones deberán ser ejecutadas forzosamente dentro de una transacción existente. En caso contrario se lanzará una Exception de tipo <span class="lang:java decode:true crayon-inline">javax.ejb.EJBTransactionRequiredException</span>.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1518" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-MANDATORY.png" alt="JTA-MANDATORY" width="587" height="440" /></p>
<ul>
<li><strong>REQUIRED:</strong> Le indicamos que la operación requieres de una transacción, por lo que, si es ejecutado dentro de una transacción existente, este se unirá a la mima. Por otro lado, si no existe una transacción este creará una nueva.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1519" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-REQUIRED.png" alt="JTA-REQUIRED" width="598" height="449" /></p>
<ul>
<li><strong>NEVER:</strong> Le indicamos que la operación por ningún motivo deberá ser ejecutado dentro de una transacción existente, ya que lanzará una Exception de tipo <span class="lang:java decode:true crayon-inline">javax.ejb.EJBException</span>. Si es ejecutado fuera de una transacción, tampoco creara una nueva.</li>
</ul>
<p><img loading="lazy" class="aligncenter wp-image-1520" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/JTA-NEVER.png" alt="JTA-NEVER" width="607" height="455" /></p>
<p>&nbsp;</p>
<p>Cuando <span class="lang:java decode:true crayon-inline">@TransactionAttribute</span> es declarada a nivel de clase, afectará a todas las operaciones definidas en el EJB, por otra parte, si es definida a nivel de método, solo afectara al método anotado. Cabe mencionar que se puede combinar definiendo la anotación a nivel de clase y luego en los métodos. El resultado será que la definición a nivel de método sobre escribirá a la de clase.</p>
<p>&nbsp;</p>
<p>El siguiente código es un ejemplo rápido de cómo se apreciaría un EJB con la anotación @TransactionAttribute.</p>
<pre class="lang:java decode:true " title="EmployeeExtendedDAO.java">@EJB
@Stateful
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EmployeeExtendedDAO implements IEmployeeDAO{

    @TransactionAttribute(TransactionAttributeType.NEVER)
    public Employee getEmployeeById(Long empId){
        //Se consulta el empleado mediante el ID
        return manager.find(Employee.class, empId);
    }
}</pre>
<p>&nbsp;</p>
<p>Podrías pensar que configurar las transacciones es muchos más complicado que solo anotar los métodos, pero la realidad es que tan solo eso es necesario, ya que el Application Server se encargará del resto. No voy a entrar un mucho detalle de cómo utilizarlas, pues tan solo es necesario definir la anotación en la clase o en los métodos, el resto queda del lado de EJB, por lo que dejaremos hasta aquí esta sección. y en la siguiente parte hablaremos de cómo gestionar las transacciones con Java SE.</p>
<p>&nbsp;<br />
<center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2016/12/12/operaciones-basicas/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/">Siguiente </a></center>		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/">Introducción a Java Transaction API(JTA)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1316</post-id>	</item>
		<item>
		<title>Trabajar con objetos pesados @Lob</title>
		<link>https://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 29 Nov 2016 15:00:48 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1185</guid>

					<description><![CDATA[<p>JPA nos permite mediante la anotación @Lob mapear con la base de datos objetos pesados, como podría ser imágenes, xml, binarios, cadenas de texto extensas, json, etc. Cualquier objeto que pueda tener un tamaña muy grande o de longitud indefinida. @Lob La anotación @Lob es lo único que se requiere para indicarle a JPA que [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/">Trabajar con objetos pesados @Lob</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-603 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA @Lob" width="150" height="83" />JPA nos permite mediante la anotación @Lob mapear con la base de datos objetos pesados, como podría ser imágenes, xml, binarios, cadenas de texto extensas, json, etc. Cualquier objeto que pueda tener un tamaña muy grande o de longitud indefinida.</p>
<h2>@Lob</h2>
<p>La anotación @Lob es lo único que se requiere para indicarle a JPA que ese campo es un objeto pesado y que debe de tratarse como tal. Por lo general se utiliza con los arreglos de bytes, ya que permite almacenar cualquier cosa.</p>
<p>La anotación @Lob no tiene ningún atributo, por lo que solo será necesario definirla para que funcione. Otro punto importante es que esta anotación creará una columna de tipo longblob en mysql y podría variar según el manejador de base de datos utilizados, pero al final siempre será un campo para objetos pesados.</p>
<p>Para poner en práctica esta anotación, retomaremos la entidad Employee, en esta ya habíamos agregado la propiedad <span class="lang:java decode:true crayon-inline">photo</span>  de tipo byte[], en la cual vamos a almacenar la foto del empleado, sin embargo, no habíamos entrado en detalles. La entidad Employee se ve de la siguiente manera:</p>
<p><span id="more-1185"></span></p>
<pre class="lang:java decode:true">package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;
import java.util.Objects;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@Entity
@Table(
    name = "EMPLOYEES" , 
    schema = "jpatutorial", 
    indexes = {@Index(name = "name_index", columnList = "name",unique = true)}
)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "EmployeeTable")
    @Column(name = "ID")
    private Long id;
    
    @Column(name = "NAME", nullable = false, length = 150)
    private String name; 
    
    @Column(name = "SALARY", nullable = false, scale = 2)
    private double salary;
    
    @Column(name = "REGIST_DATE", updatable = false, nullable = false)
    @Temporal(TemporalType.DATE)
    private Calendar registDate;
    
    @Column(name="STATUS", nullable = false, length = 8 )
    @Enumerated(value = EnumType.STRING)
    private Status status;
    
    @Column(name = "PHOTO" ,nullable = true)
    @Basic(optional = false, fetch = FetchType.EAGER)
    @Lob()
    private byte[] photo;
    
    /**
     * GETs and SETs
     */
}</pre>
<p>Observemos que @Lob es mucho más simple de lo que parece, sin embargo, recordemos que siempre serán necesarias las anotaciones @Column &amp; @Basic para definir los atributos de la columna y la estrategia de carga. Por lo general las propiedades marcadas como @Lob son cargadas en la creación del objeto y no siempre es requerido el objeto pesado, por lo que es aconsejable utilizar la anotación @Basic y marcar el atributo como LAZY.</p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a><figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br />
<img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption></figure>
<p>Finalmente, la tabla de empleados se vera de la siguiente manera:</p>
<p><img loading="lazy" class="aligncenter wp-image-1176 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/Table-1.jpg" alt="@lob" width="233" height="191" /></p>
<p><strong>NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.</strong></p>
<p><center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/30/atributos-volatiles-transient/">Siguiente </a></center></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/">Trabajar con objetos pesados @Lob</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1185</post-id>	</item>
		<item>
		<title>Estrategias de carga con @Basic</title>
		<link>https://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 24 Nov 2016 09:00:30 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1175</guid>

					<description><![CDATA[<p>@Basic es una anotación que nos permite controlar el momento en que una propiedad es cargada desde la base de datos, evitando que traer valores que no son necesario al momento de cargar el objeto. Esta anotación es utilizada generalmente para anotar objetos pesados, como una imagen o un archivo binario. @Basic En JPA existe [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/">Estrategias de carga con @Basic</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-603 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA @Basic" width="150" height="83" />@Basic es una anotación que nos permite controlar el momento en que una propiedad es cargada desde la base de datos, evitando que traer valores que no son necesario al momento de cargar el objeto. Esta anotación es utilizada generalmente para anotar objetos pesados, como una imagen o un archivo binario.</p>
<h2>@Basic</h2>
<p>En JPA existe dos conceptos que son claves para entender cómo es que JPA carga los objetos desde la base de datos y estos son claves para mejorar el rendimiento de la aplicación, estos conceptos se explican a continuación:</p>
<ul>
<li>Lazy loading (Carga demorada): Los objetos de carga demorada no serán cargados desde la base de datos cuando el objeto sea creado, pero será cargado en cuanto se acceda a la propiedad. De esta manera JPA identifica cuando la propiedad es accedida por primera vez para cargar el valor desde la base de datos.
<ul>
<li>@Basic( fetch = FetchType.LAZY )</li>
</ul>
</li>
<li>Eager loading (Carga ansiosa o temprana): Este es la utilizada por default para la mayoria de las propiedades en JPA, a excepción de las colecciones las cuales las analizaremos mas adelante.
<ul>
<li>@Basic( fetch = FetchType.EAGER )</li>
</ul>
</li>
</ul>
<p><span id="more-1175"></span></p>
<p>Lazy loading se logra mediante la utilización del patrón de diseño <a href="http://www.oscarblancarteblog.com/2014/07/29/patron-de-diseno-proxy/">Proxy</a>, el cual también explico con más detalle en <a href="http://www.oscarblancarteblog.com/libros/introduccion-los-patrones-diseno/">mi libro</a>.</p>
<p>La anotación @Basic define además la propiedad optional, la cual es de tipo booleano, si se le indica true, se decimos a JPA que esta propiedad es opcional y en ella puede haber un valor Null, en caso se ser false, le indicamos que la propiedad siempre deberá tener valor. Esta propiedad es más que nada para ayudar a JPA a optimizar los query para obtener los valores. Pero tendrá que corresponder con la realidad, ya que en caso de marcar que no es opcional y este valor es null en la base de datos JPA marca error.</p>
<p><strong>NOTA:</strong> <span class="lang:java decode:true crayon-inline">optional</span>  es diferente  de <span class="lang:java decode:true crayon-inline">nullable</span>  de <a href="http://www.oscarblancarteblog.com/2016/11/10/definicion-columnas-column/">@Column</a>, pues nullable sirve para definir la estructura de la columna y optional son sugerencias a JPA para optimizar los querys. Nunca debemos de confundir eso.</p>
<p>Un punto importante es que @Basic se puede emplear prácticamente para cualquier como tipos primitivos, clases wrapper, Calendar, enums, Time, Date, Timestamp. byte[], char[], clases que implementan java.lang.Serializable, etc.</p>
<p>Ya con toda la teoría, pasaremos a ponerla en práctica. Retómenos la clase Employee que hemos utilizando en todos el tutorial para agregar una nueva propiedad llamada photo, esta será de tipo bute[] y guardara el binario de la foto del empleado. La foto al ser un campo pesado lo marcaremos como LAZY, para evitar que se cargue al crear el objeto y solo cuando sea necesario se cargue. Por otra parte, la foto del empleado no es obligatoria por lo que definiremos la propiedad optional = true.  Veamos cómo quedaría:</p>
<pre class="lang:java decode:true " title="Employee.java">package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;
import java.util.Objects;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@Entity
@Table(
    name = "EMPLOYEES" , 
    schema = "jpatutorial", 
    indexes = {@Index(name = "name_index", columnList = "name",unique = true)}
)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "EmployeeTable")
    @Column(name = "ID")
    private Long id;
    
    @Column(name = "NAME", nullable = false, length = 150)
    private String name; 
    
    @Column(name = "SALARY", nullable = false, scale = 2)
    private double salary;
    
    @Column(name = "REGIST_DATE", updatable = false, nullable = false)
    @Temporal(TemporalType.DATE)
    private Calendar registDate;
    
    @Column(name="STATUS", nullable = false, length = 8 )
    @Enumerated(value = EnumType.STRING)
    private Status status;
    
    @Column(name = "PHOTO" ,nullable = true)
    @Basic(optional = false, fetch = FetchType.EAGER)
    @Lob()
    private byte[] photo;
    
    /**
     * GETs and SETs
     */
}</pre>
<p>Veamos que la anotación <a href="http://www.oscarblancarteblog.com/2016/11/10/definicion-columnas-column/">@Column</a> se define para indicar el nombre de la columna de la base de datos y está definida la propiedad nullable=true debido a que la foto no es obligatoria. Recordemos la diferencia entre nullable &amp; optional que ya analizamos.</p>
<p><strong>NOTA:</strong> En la siguiente sección describiremos la anotación @Lob, por lo pronto solo dejémosla pasar por alto.</p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a><figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br />
<img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption></figure>
<p>Finalmente, y tras ejecutar la aplicación para creer las tablas, veremos que la tabla queda de la siguiente manera:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-1176" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/Table-1.jpg" alt="@Basic" width="233" height="191" /></p>
<p>La columna PHOTO se ha creado de tipo Longblob debido a que la propiedad es de tipo byte[] y puede ser de gran tamaño.</p>
<p><strong>NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.</strong></p>
<p><center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more " style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/">Siguiente </a></center></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/">Estrategias de carga con @Basic</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1175</post-id>	</item>
		<item>
		<title>Mapeo de fechas con @Temporal</title>
		<link>https://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 23 Nov 2016 09:00:06 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1143</guid>

					<description><![CDATA[<p>Mediante la anotación @Temporal es posible mapear las fechas con la base de datos de una forma simple. Una de las principales complicaciones cuando trabajamos con fecha y hora es determinar el formato empleado por el manejador de base de datos. Sin embargo, esto ya no será más problema con @Temporal. Mediante el uso de [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/">Mapeo de fechas con @Temporal</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2><img loading="lazy" class="alignleft wp-image-603 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA @Temporal" width="150" height="83" /></h2>
<p style="text-align: justify;">Mediante la anotación @Temporal es posible mapear las fechas con la base de datos de una forma simple. Una de las principales complicaciones cuando trabajamos con fecha y hora es determinar el formato empleado por el manejador de base de datos. Sin embargo, esto ya no será más problema con @Temporal.</p>
<p style="text-align: justify;">Mediante el uso de @Temporal es posible determinar si nuestro atributo almacena Hora, Fecha u Hora y fecha, y es posible utilizar la clase Date o Calendar para estos fines. Yo siempre recomiendo utilizar Calendar, pues tiene muchas más operaciones para manipular fecha y hora.</p>
<p style="text-align: justify;">Se pueden establecer tres posibles valores para la anotación:</p>
<ul>
<li><strong>DATE:</strong> Acotara el campo solo a la Fecha, descartando la hora.
<ul>
<li>@Temporal(TemporalType.DATE)</li>
</ul>
</li>
<li><strong>TIME:</strong> Acotara el campo solo a la Hora, descartando a la fecha.
<ul>
<li>@Temporal(TemporalType.TIME)</li>
</ul>
</li>
<li><strong>TIMESTAMP:</strong> Toma la fecha y hora.
<ul>
<li>@Temporal(TemporalType.TIMESTAMP)</li>
</ul>
</li>
</ul>
<p style="text-align: justify;"><span id="more-1143"></span></p>
<p style="text-align: justify;">Para ejemplificar como utilizar esta anotación retomaremos la Entidad Employee que ya hemos venido utilizando en todo este tutorial. En el pasado ya habíamos agregado un atributo llamado registDate que representaba la fecha de ingreso del empleado, pero no habíamos entrando en detalle, por lo que ahora será tiempo de regresar y analizarlo. Veamos como dejamos la entidad Employee:</p>
<pre class="lang:java decode:true">package com.obb.jpa.jpaturorial.entity;

import java.util.Calendar;
import java.util.Objects;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@Entity
@Table(
    name = "EMPLOYEES" , 
    schema = "jpatutorial", 
    indexes = {@Index(name = "name_index", columnList = "name",unique = true)}
)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "EmployeeTable")
    @Column(name = "ID")
    private Long id;
    
    @Column(name = "NAME", nullable = false, length = 150)
    private String name; 
    
    @Column(name = "SALARY", nullable = false, scale = 2)
    private double salary;
    
    @Column(name = "REGIST_DATE", updatable = false, nullable = false)
    @Temporal(TemporalType.DATE)
    private Calendar registDate;
    
    @Column(name="STATUS", nullable = false, length = 8 )
    @Enumerated(value = EnumType.STRING)
    private Status status;
    
    /**
     * GETs and SETs
     */
}</pre>
<p style="text-align: justify;">En este caso hemos determinado que la fecha de ingreso es solo fecha (DATE) puesto que no es de nuestro interés la hora. Observemos también que hemos definido la anotación <a href="http://www.oscarblancarteblog.com/2016/11/10/definicion-columnas-column/">@Column</a> para definir el nombre de la columna contra la que mapea.</p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a><figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br />
<img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption></figure>
<p style="text-align: justify;">Veamos cómo quedaría la tabla generada hasta el momento:</p>
<p style="text-align: justify;"><img loading="lazy" class="aligncenter size-full wp-image-1144" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/11/Tabla.jpg" alt="@Temporal" width="215" height="178" /></p>
<p style="text-align: justify;">Observa la columna REGIST_DATE es de tipo DATE.</p>
<p style="text-align: left;"><strong>NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.</strong></p>
<p><center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/14/mapeo-enumeraciones-enumerated/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/24/estrategias-de-carga-con-basic/">Siguiente </a></center></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/">Mapeo de fechas con @Temporal</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/23/mapeo-fechas-temporal/feed/</wfw:commentRss>
			<slash:comments>22</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1143</post-id>	</item>
		<item>
		<title>JPA y los métodos hashCode &#038; equals</title>
		<link>https://www.oscarblancarteblog.com/2016/11/16/jpa-los-metodos-hashcode-equals/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/16/jpa-los-metodos-hashcode-equals/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 16 Nov 2016 09:00:24 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1062</guid>

					<description><![CDATA[<p>Por defecto, todos los objetos en Java heredan de la case Object los métodos hashCode y equals los cuales sirvan para identificar si dos variables hacen referencia al mismo objeto. El comportamiento de facto del método hashCode retorna la posición en memoria de un objeto, y el método equals compara el hashCode de los dos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/16/jpa-los-metodos-hashcode-equals/">JPA y los métodos hashCode &#038; equals</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="size-full wp-image-603 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA persistence.xml" width="150" height="83" />Por defecto, todos los objetos en Java heredan de la case Object los métodos hashCode y equals los cuales sirvan para identificar si dos variables hacen referencia al mismo objeto.<br />
El comportamiento de facto del método hashCode retorna la posición en memoria de un objeto, y el método equals compara el hashCode de los dos objetos evaluados, de esta forma, si las dos variables hacen referencia a la misma posición de memoria, entonces se dice que son igual, de lo contrario son diferentes.<br />
En el caso de las Entidades, la implementación default de estos métodos no funciona correctamente, debido a que una Entidad de dice que es igual a otra si se cumplen dos condiciones:</p>
<p>• Los dos objetos son de la misma clase.<br />
• El valor de su ID (@Id) son iguales</p>
<p>Si estas dos condiciones se cumplen entonces las dos entidades son iguales sin importar que no hagan referencia a mismo objeto en memoria. Debido a esto, es que es importante sobrescribir estos dos métodos para que evalúen a una Entidad por las dos condiciones mencionadas.</p>
<h2>Implementando los métodos hashCode &amp; equals</h2>
<p>Algo que me ha llamado mucho la atención es que a pesar de que estos dos métodos son básicos y que se utilizan con regularidad, muchas personas no entienden como trabajan internamente y aún menos como sobrescribirlos correctamente, si eres una de esas personas, no te preocupes ya que los IDE’s ya tiene por default utilidades que nos ayudan a generarlos de forma adecuada.<br />
Lo primero que haremos será abrir la entidad Employee que hemos venido trabajando a lo largo de este tutorial. Luego presionaremos Source &gt; Insert Code del menú principal, esto arrojara una pequeña lista de acciones, seleccionamos la opción equals() and hashCode(). Nos arrojara una pantalla como la siguiente:<br />
<img loading="lazy" class="aligncenter size-full wp-image-1063" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/generateEqualsyHashcode.png" alt="Método equals y hashcode" width="550" height="342" /><span id="more-1062"></span><br />
En esta pantalla debemos todos los campos que conformen el ID de la Entidad, en este caso solo sería el atributo ID, lo seleccionamos en las dos listas como aparece en la imagen anterior, y presionamos generate. Esto concluirá la generación de los dos métodos y se deberán de ver así:</p>
<pre class="lang:java decode:true">package com.obb.jpa.jpaturorial.entity;

import java.util.Objects;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@Entity
@Table(
    name = "EMPLOYEES" , 
    schema = "jpatutorial", 
    indexes = {@Index(name = "name_index", columnList = "name",unique = true)}
)
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY, generator = "EmployeeTable")
    private Long id;
    private String name; 

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Employee other = (Employee) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

     /**
     * GETs and SETs
     */
}</pre>
<p>El método hashCode regresará un hash generado a partir del ID, veamos que en la ecuación interviene un variable hash con valor 7. No te preocupes por eso, es solo un número generado al azar.</p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a><figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br />
<img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption></figure>
<p>Por otra parte el método equals lo primero que hará será comparar los dos objetos con el operador ==, este operador se traduce en la llamada del método hashCode de tal manera que this == obj sería igual a this.hashCode() == obj.hashCode(), y como va vimos el hashCode se genera a partir del ID y no a la posición de memoria, por tal motivo la expresión solo sería verdadera en caso de ambos objetos tengan el mismo ID.</p>
<p><strong>NOTA: Este artículo es solo una sección del Tutorial de JPA, para ver el contenido completo de este tutorial regresa al Índice en el botón de abajo.</strong></p>
<p><center><a class="btn btn-default read-more " style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/02/llaves-compuestas-idclass/">Anterior</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">Índice</a><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="http://www.oscarblancarteblog.com/2016/11/08/embeber-llave-primaria-embeddedid/">Siguiente </a></center></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/11/16/jpa-los-metodos-hashcode-equals/">JPA y los métodos hashCode &#038; equals</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/16/jpa-los-metodos-hashcode-equals/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1062</post-id>	</item>
	</channel>
</rss>
