<?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/"
	>

<channel>
	<title>JPA &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/category/jpa/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</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</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[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;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-manytomany-1024x575.jpg" alt="" class="wp-image-2586"/></figure>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-list"><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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph">Como resultado de estas Entidades, tendremos las siguientes tablas auto generadas:</p>



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



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-heading">Prueba de validación</h2>



<p class="wp-block-paragraph">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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 fetchpriority="high" decoding="async" 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 class="wp-block-paragraph">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 decoding="async" 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 decoding="async" 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 decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/rel-books-auths-table.jpg" alt="" class="wp-image-2594"/></figure></div>



<p class="wp-block-paragraph">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 class="wp-block-heading">Conclusiones</h2>



<p class="wp-block-paragraph">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>
]]></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[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;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-onetomany-1024x575.jpg" alt="JPA relaciones @OneToMany" class="wp-image-2556"/></figure>



<p class="wp-block-paragraph">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 is-layout-flow wp-block-quote-is-layout-flow"><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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph">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 class="wp-block-paragraph"><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 class="wp-block-paragraph"><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 decoding="async" 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 class="wp-block-paragraph"><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 class="wp-block-paragraph"><br>Dando como resultado los siguientes registros en la base de datos:</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" 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 decoding="async" 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 class="wp-block-paragraph">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 class="wp-block-heading">Conclusiones</h2>



<p class="wp-block-paragraph">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>
]]></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>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[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;]]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="auto, (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 decoding="async" 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 decoding="async" 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 decoding="async" 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 decoding="async" 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>
]]></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[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;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="auto, (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>
]]></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>JPA &#8211; Resource Local transaction</title>
		<link>https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/</link>
					<comments>https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 09 Mar 2017 09:00:56 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1528</guid>

					<description><![CDATA[Resource Local es un tipo de transaccionalidad que soporta JPA que delegar la responsabilidad de las transacciones al programador, de esta manera, el programador será el único responsable de abrir y cerrar las conexiones, realizar los Rollback y cerrar las conexiones no utilizadas. &#160; En la sección pasada de este tutorial dimos una breve Introducción [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="aligncenter wp-image-1529" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/Resource-Local-transaction.jpg" alt="JPA Resource Local" width="875" height="492" />Resource Local es un tipo de transaccionalidad que soporta JPA que delegar la responsabilidad de las transacciones al programador, de esta manera, el programador será el único responsable de abrir y cerrar las conexiones, realizar los Rollback y cerrar las conexiones no utilizadas.<span id="more-1528"></span></p>
<p>&nbsp;</p>
<p>En la sección pasada de este tutorial dimos una breve <a href="https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/">Introducción a Java Transaction API (JTA)</a>, otra forma de administrar las transacciones de forma automática por medio del Application Server. Resource Local es utilizado casi por completo en aplicaciones de escritorio o aplicaciones Core que corren de forma standalone y que por lo tanto no corren sobre toda la infraestructura que provee un Application Server forma. Las aplicaciones que decidan utilizar este tipo de transacciones deberá indicarlo al momento de crear el Persistence Unit del archivo persistence.xml:</p>
<p><span class="lang:xhtml decode:true crayon-inline">&lt;persistence-unit name=&#8221;JPA_PU&#8221; transaction-type=&#8221;RESOURCE_LOCAL&#8221;&gt; </span></p>
<p>Otra de las cuestiones importantes a remarcar es que la <a href="https://www.oscarblancarteblog.com/2016/12/01/concepto-inversion-of-control/">inyección de dependencias (CDI)</a> no estará disponible en ambientes Java SE, por lo que estaremos obligados a crear manualmente el <span class="lang:java decode:true crayon-inline ">EntityManager</span>  a través de <span class="lang:java decode:true crayon-inline ">EntityManagerFactory</span>, para esto podemos crearlo de la siguiente manera:</p>
<p>EntityManagerFactory factory = Persistence.createEntityManagerFactory(&#8220;JPA_PU&#8221;);</p>
<p>EntityManager manager = factory.createEntityManager();</p>
<p>Lo primero que se debe de crear es el <span class="lang:java decode:true crayon-inline ">EntityManagerFactory</span>, el cual se crea a partir de la clase <span class="lang:java decode:true crayon-inline ">Persistence</span> y se le envía como parámetro el nombre del PersistenceUnit. Seguido, es creado el <span class="lang:java decode:true crayon-inline ">EntityManager</span> a partir del <span class="lang:java decode:true crayon-inline ">EntityManagerFactory</span>.</p>
<p>&nbsp;</p>
<h2> Trabajar con Transacciones Resource Local</h2>
<p>&nbsp;</p>
<p>Para trabajar con Resource Local es necesario familiarizarnos con la clase EntityTransaction:</p>
<pre class="lang:java decode:true" title="EntityTransaction.java">package javax.persistence;

public interface EntityTransaction {
     public void begin();
     public void commit();
     public void rollback();
     public void setRollbackOnly();
     public boolean getRollbackOnly();
     public boolean isActive();
}</pre>
<p>&nbsp;</p>
<p>Mediante esta clase es posible controlar las transacciones de JPA, es obtenida a través del <span class="lang:java decode:true crayon-inline ">EntityManager</span> con el método <span class="lang:java decode:true crayon-inline ">getTransaction</span>. Esta clase una serie de métodos que nos permitirán controlar las transacciones. Los métodos son los siguientes:</p>
<ul>
<li><strong>Begin:</strong> Se utiliza para iniciar una nueva transacción. Lanza una <span class="lang:java decode:true crayon-inline ">IllegalStateException</span> cuando la transacción ya está activa.</li>
<li><strong>Commit:</strong> Realiza commit a la transacción activa. Lanza <span class="lang:java decode:true crayon-inline ">IllegalStateException</span> cuando la transacción no está activa o <span class="lang:java decode:true crayon-inline ">RollbackException</span> cuando se genera un error al realizar el commit</li>
<li><strong>Rollback:</strong> Realiza un Rollback de la transacción y echa atrás todos los cambios realizados durante la transacción. Lanza <span class="lang:java decode:true crayon-inline ">IllegalStateException</span> cuando la transacción no está activa o <span class="lang:java decode:true crayon-inline ">PersistenceException</span> ante cualquier posible error inesperado.</li>
<li><strong>setRollbackOnly:</strong> Marca la transacción para que se realice un Rollback después de terminar la ejecución (Se aconseja usar solo en EJB).</li>
<li><strong>GetRollbackOnly:</strong> Indica si la transacción ha sido marcada para hacer Rollback</li>
<li><strong>isActive:</strong> Retorna true si existe una transacción activa, false de lo contrario.</li>
</ul>
<p>&nbsp;</p>
<p>El siguiente ejemplo ilustra cómo es que suele utilizar la clase EntityTransaction:</p>
<pre class="lang:java decode:true ">public void saveEmployee(Employee emp){
    EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA_PU");
    EntityManager manager = factory.createEntityManager();
    try {
        manager.getTransaction().begin();
        manager.persist(emp);
        manager.getTransaction().commit();
    } catch (Exception e) {
        if(manager.getTransaction().isActive()){
            manager.getTransaction().rollback();
        }
    }
}</pre>
<p>&nbsp;</p>
<p>Este es un simple método que guarda un nuevo empleado. Primero que nada, se crear el <span class="lang:java decode:true crayon-inline ">EntityManager</span> como ya lo explicamos, luego en la línea 5 se abre una nueva transacción, para después realizar el guardado, en la línea 7 se realiza el commit. En caso de que algo salga mal, entonces el error cae en el Catch y se valida que exista una transacción activa (línea 9) para después proceder con el Rollbak (línea 10).</p>
<p>&nbsp;</p>
<p>Como vemos, trabajar con Resource Local puede llegar a ser un poco más complicado, pero esa es la única alternativa si estamos trabajando con aplicaciones de Escritorio.</p>
<p><center><a class="btn btn-default read-more" style="display: inline-block; float: none; margin-right: 15px;" href="https://www.oscarblancarteblog.com/2016/12/20/introduccion-java-transaction-api-jta/">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/06/relacion-muchos-a-uno-con-manytoone/">Siguiente </a></center>		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1528</post-id>	</item>
		<item>
		<title>Entity Manager &#038; Persistence Context</title>
		<link>https://www.oscarblancarteblog.com/2017/02/21/entitymanager-persistencecontext/</link>
					<comments>https://www.oscarblancarteblog.com/2017/02/21/entitymanager-persistencecontext/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 21 Feb 2017 12:33:40 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1392</guid>

					<description><![CDATA[Hasta el momento solo hemos trabajado con el Entity Manager para realizar las operaciones básicas, pero existen detalles más finos que es necesario entender para convertirnos en expertos de JPA. Cuando trabajamos con JPA es común interactuar con el Entity Manager, ¿pero que tanto sabemos acerca de los Persistence Context en realidad? &#160; Primero que [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="size-full wp-image-603 alignleft" src="https://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA persistence.xml" width="150" height="83" />Hasta el momento solo hemos trabajado con el Entity Manager para realizar las operaciones básicas, pero existen detalles más finos que es necesario entender para convertirnos en expertos de JPA. Cuando trabajamos con JPA es común interactuar con el Entity Manager, ¿pero que tanto sabemos acerca de los Persistence Context en realidad?</p>
<p>&nbsp;</p>
<p>Primero que nada, tenemos que saber que el Persistence Context se crea mediante un Persistence Unit y el Entity Manager se crea a partir de un Persistence Context, veamos la siguiente imagen para entender mejor:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-1394" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/Persistence-Context.png" alt="persistence context" width="661" height="308" /></p>
<p>&nbsp;</p>
<p>Veamos que todo parte del archivo <a href="https://www.oscarblancarteblog.com/2016/10/26/entitymanager-archivo-persistence-xml/">persistence.xml</a> del cual ya hablamos anteriormente, en este archivo se definen los Persistence Unit, y mediante estos es creado el Persistence Context, el Persistence Context tiene la finalidad de delimitar el alcance de las transacciones, pero también está delimitado a administrar las Entidades definidas por el Persistence Unit con el que fue creado.  Adicionalmente, el Entity Manager hace referencia a un Persistence Context el cual será utilizado para administrar las entidades y las transacciones.<span id="more-1392"></span></p>
<p>&nbsp;</p>
<p>Una de las ventajas de tener varios Persistence Unit, es que nos permite definir diferentes configuraciones para cada uno, de esta manera podemos delimitar las entidades de cada módulo e incluso una configuración de base de datos diferentes para cada uno.</p>
<p>&nbsp;</p>
<h2>Container-Managed Entity Manager</h2>
<p>&nbsp;</p>
<p>Básicamente existen dos formas de trabajar con JPA, la más simple es cuando lo utilizamos en aplicaciones SE o de escritorio y la segunda forma que es la que estudiaremos en esta sección, es cuando lo utilizamos en ambientes de Java EE con EJB.</p>
<p>La principal característica de utilizar Entity Manager administrado por el contenedor, es que es el mismo Container el que se encarga de abrir y cerrar las transacciones, por lo que el programador solo se preocupa por implementar la lógica de negocio despreocupándose en la totalidad de las transacciones.</p>
<p>En ambientes Java EE se suele utilizar la anotación <span class="lang:java decode:true crayon-inline ">@PersistenceContext</span>  para crear el EntityManager, como veremos en el siguiente EJB.</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true" title="EmployeeDAO.java">package com.obb.jpa.jpaturorial.entitymanager;

import javax.ejb.*;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@EJB
@Stateless
public class EmployeeDAO implements IEmployeeDAO{

    @PersistenceContext(unitName = "JPA_PU")
    private EntityManager manager;
}</pre>
<p>&nbsp;</p>
<p>Cuando utilizamos la anotación <span class="lang:java decode:true crayon-inline ">@PersistenceContext</span>  el contenedor inyecta de forma automática una referencia válida del EntityManager creado a partir de la Persistence Unit <strong>JPA_PU</strong>, de esta forma, el programador podrá utilizar el EntityManager en cualquier método que defina, y las transacciones será administradas de forma automática.</p>
<p>&nbsp;</p>
<p>Ahora bien, existen dos variantes de los Container-Managed, Transaction-Scope y Extended, los cuales son utilizados en circunstancias diferentes. Para utilizar una variante o la otra, es necesario definirlo en la anotación <span class="lang:java decode:true crayon-inline ">@PersistenceContext</span> <strong> </strong>mediante la propiedad <strong>type</strong>. Los valores posibles son <span class="lang:java decode:true crayon-inline">TRANSACTION</span>  y <span class="lang:java decode:true crayon-inline ">EXTENDED</span>  como veremos a continuación:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true">@PersistenceContext(unitName = "JPA_PU", type = PersistenceContextType.TRANSACTION)
@PersistenceContext(unitName = "JPA_PU", type = PersistenceContextType.EXTENDED)</pre>
<p>&nbsp;</p>
<p>En caso de no definir la propiedad type, el valor por default será TRANSACTION, lo cual está bien, porque es por lejos la variante más utilizada.</p>
<p>&nbsp;</p>
<h3>Transaction-Scope</h3>
<p>&nbsp;</p>
<p>La variante Transaction-Scope es la variante utiliza por default, por lo que no es necesario definir la propiedad type para utilizarla. Esta variante tiene la particularidad de que el contexto de persistencia solo será válido durante le ejecución de la operación de negocio, una vez que la operación termine el contexto de persistencia se destruye y todas las entidades relacionadas con el Entity Manager será descartadas.</p>
<p>Este tipo de estrategias se utiliza para EJB sin estado como los <span class="lang:java decode:true crayon-inline">@Stateless</span>, pues cada invocación a una operación de negocio se espera que realice una acción, persista y retorne un resultado, y cada ejecución tendrá un contexto de persistencia diferente, garantizando de esta forma que el servicio siempre arroje el mismo resultado para la misma entrada.</p>
<p>Veamos un ejemplo de un servicio de creación de empleados:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true">package com.obb.jpa.jpaturorial.entitymanager;
import com.obb.jpa.jpaturorial.entity.Employee; 
import javax.ejb.*; 
import javax.persistence.*; 
/** 
* @author Oscar Blancarte 
*/ 
@EJB 
@Stateless 
public class EmployeeDAO implements IEmployeeDAO{ 
@PersistenceContext(unitName = "JPA_PU", type = PersistenceContextType.TRANSACTION) 
private EntityManager manager; 

@TransactionAttribute(TransactionAttributeType.NEVER) 
public Employee getEmployeeById(Long empId){ 
//Se consulta el empleado mediante el ID 
return manager.find(Employee.class, empId); 
} 

@TransactionAttribute(TransactionAttributeType.SUPPORTS) 
public void updateEmployeeName(Long empId, String newName){ 
//El empleado es nuevamente consultado de la base de datos 
//debido a que cada invocación es un nuevo contexto de persistencia 
Employee emp = manager.find(Employee.class, empId); 
emp.setName(newName); 
//Al termina el método, el contenedor realiza un Commit automático. 
} 
}</pre>
<p>&nbsp;</p>
<p>Imaginemos el siguiente escenario, tenemos una aplicación que carga el empleado en pantalla utilizando el método <span class="lang:java decode:true crayon-inline ">getEmployeeById</span>, esta consulta al empleado mediante el ID y lo retorna, la aplicación utiliza el empleado consultado para mostrarlo en pantalla, luego, modificamos el nombre del empleado y guardamos los cambios mediante el método <span class="lang:java decode:true crayon-inline ">updateEmployeeName</span>.</p>
<p>Lo primero que hace la aplicación es consultar el empleado, hasta aquí todo bien, pero cuando actualizamos el nombre del empleado, vemos que realizamos un find mediante el ID del empleado, podríamos pensar que como ya lo hemos consultado anteriormente mediante el método <span class="lang:java decode:true crayon-inline">getEmployeeById</span> este solo lo retomará del cache sin realizar una nueva consulta a la base de datos, sin embargo, Transaction-Scope garantiza que cada ejecución crea un nuevo PersistenceContext en blanco, por lo que el empleado que anteriormente ya habíamos consultado será nuevamente consultado, debido que en la segunda llamada al método <span class="lang:java decode:true crayon-inline ">updateemployeeName</span> el Persistence Context está en blanco.</p>
<p>&nbsp;</p>
<p>No te preocupes por las anotaciones <span class="lang:java decode:true crayon-inline ">@TransactionAttribute</span>, más adelante las explicaremos por ahora pasémoslas por alto.</p>
<p>&nbsp;</p>
<h3>Extended</h3>
<p>&nbsp;</p>
<p>La segunda variante es Extended, que como su nombre nos lo indica, se trata de un Contexto de Persistencia Extendido, donde el contexto persistirá durante todo el tiempo de vida de la sesión, sin importar el número de operaciones o transacciones que se realicen.</p>
<p>A diferencia de Transaction-Scope, en esta variante todos los cambios realizados en el Persistence Context seguirán vigentes, por lo que cada ejecución que realicemos se favorecerá de las ejecuciones pasadas.</p>
<p>Este tipo de variante es utilizada cuando trabajamos con EJB con sesión como el <span class="lang:java decode:true crayon-inline">@Stateful</span>, veamos el mismo ejemplo anterior pero esta vez utilizando un EJB con sesión y la variante Extended.</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true " title="EmployeeExtendedDAO.java">package com.obb.jpa.jpaturorial.entitymanager;

import com.obb.jpa.jpaturorial.entity.Employee;
import javax.ejb.*;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@EJB
@Stateful
public class EmployeeExtendedDAO implements IEmployeeDAO{
    
    @PersistenceContext(unitName = "JPA_PU", type = PersistenceContextType.EXTENDED)
    private EntityManager manager;
    
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public Employee getEmployeeById(Long empId){
        //Se consulta el empleado mediante el ID
        return manager.find(Employee.class, empId);
    }
    
    @TransactionAttribute(TransactionAttributeType.SUPPORTS)
    public void updateEmployeeName(Long empId, String newName){
        //El empleado no es consultado, debido a que ya fue consultado previamente
        Employee emp = manager.find(Employee.class, empId);
        emp.setName(newName);
        //Al termina el método, el contenedor realiza un Commit automático.
        //Los camibios realizados seguiran estando disponibles
    }
}</pre>
<p>&nbsp;</p>
<p>En este caso las cosas son un poco diferentes. Primero que nada, se realiza la consulta del empleado mediante el método <span class="lang:java decode:true crayon-inline">getEmployeeById</span> y el empleado es retornado, cuando la ejecución del método termina, el Persistence Context continúa existiendo, por lo que cuando se realiza la actualización del nombre del empleado y se realiza la consulta del empleado, el Entity Manager ya no consulta al empleado, pues este ya fue consultado en el método anterior. Finalmente, el nombre es actualizado y al terminar el método se hace un commit de la transacción. Al finalizar el método el Contexto de persistencia continua activo hasta que la sesión finaliza.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Application-Managed Entity Manager</h2>
<p>&nbsp;</p>
<p>La segunda forma de trabajar con JPA es delegar al programador la responsabilidad de administrar las transacciones, este escenario se da con mucha más frecuencia en aplicaciones de escritorio, aunque existen escenarios donde es utilizado en entornos de Java EE.</p>
<p>Básicamente el programador tiene que crear el <strong>EntityManager</strong> a través del <strong>EntityManagerFactory</strong> y tiene que abrir y cerrar las transacciones cada vez que requiera.</p>
<p>Veamos cómo quedaría el escenario anteriormente planteado utilizando application-managed:</p>
<pre class="lang:java decode:true " title="EmployeeApplicationDAO.java">package com.obb.jpa.jpaturorial.entitymanager;

import com.obb.jpa.jpaturorial.entity.Employee;
import javax.ejb.*;
import javax.persistence.*;

/**
* @author Oscar Blancarte
*/
public class EmployeeApplicationDAO {

private EntityManager manager;

public EmployeeApplicationDAO() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA_PU");
manager = emf.createEntityManager();
}

public Employee getEmployeeById(Long empId) {
return manager.find(Employee.class, empId);
}

public void updateEmployeeName(Long empId, String newName) {
//Se abre la transacción manualmente
manager.getTransaction().begin();
Employee emp = manager.find(Employee.class, empId);
emp.setName(newName);
//Se cierra la transacción manulamente
manager.getTransaction().commit();
}
}</pre>
<p>Podemos apreciar que el constructor de la clase estamos creando manualmente el EntityManager en lugar de simplemente inyectarlo como el Container-Managed, la otra diferencia es en el método <span class="lang:java decode:true crayon-inline">updateEmployeeName</span>, ya que para poder persistir los cabios tenemos que abrir y cerrar la transacción con los métodos <strong>beign</strong> y <strong>commit</strong>.</p>
<p>&nbsp;</p>
<p><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/2016/12/20/introduccion-java-transaction-api-jta/">Siguiente </a></center>		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/02/21/entitymanager-persistencecontext/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1392</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[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;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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" decoding="async" 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>
]]></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>Operaciones básicas</title>
		<link>https://www.oscarblancarteblog.com/2016/12/12/operaciones-basicas/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/12/operaciones-basicas/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 12 Dec 2016 09:00:06 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1110</guid>

					<description><![CDATA[Una parte esencial de utilizar JPA es saber utilizar las operaciones básicas, operaciones mediante las cuales es posible consultar, persistir, actualizar y eliminar entidades, de estas operaciones estaremos hablando hoy. &#160; Gran parte de la funcionalidad de JPA es expuesta por medio de la Interface EntityManager, de la cual ya hemos hablado con anterioridad, y [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="alignleft wp-image-603" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-1024x565.jpg" alt="Operaciones básicas" width="150" height="83" />Una parte esencial de utilizar JPA es saber utilizar las operaciones básicas, operaciones mediante las cuales es posible consultar, persistir, actualizar y eliminar entidades, de estas operaciones estaremos hablando hoy.</p>
<p>&nbsp;</p>
<p>Gran parte de la funcionalidad de JPA es expuesta por medio de la Interface <a href="http://www.oscarblancarteblog.com/2016/10/26/entitymanager-archivo-persistence-xml/" target="_blank">EntityManager</a>, de la cual ya hemos hablado con anterioridad, y es por medio de esta interface, que es posible realizar las operaciones básicas. Las operaciones o métodos que exponen EntityManager son persist, merge, remove, find entre otras, que son sin duda las operaciones que más utilizaremos los proyectos.</p>
<p>En la sección anterior de este tutorial, hablamos de los <a href="http://www.oscarblancarteblog.com/2016/12/05/ciclo-vida-las-entidades/" target="_blank">estados de las entidades</a>, las cuales será clave para entender cómo y cuándo deberemos utilizar dichas operaciones.</p>
<p>&nbsp;</p>
<p>Sin más, las operaciones se describen a continuación:</p>
<p><span id="more-1110"></span></p>
<h2>Método Persist</h2>
<p>Mediante esta operación es posible persistir en la base de datos una nueva (new) Entidad, la cual ha sido creada recientemente o persistir una Entidad que se encuentra en el Persistence Context (Atached).</p>
<p>Esta operación la debemos de utilizar cuando queremos persistir una Entidad que ha sido creada recientemente mediante el operador new, o cuando queremos actualizar una Entidad que fue cargada previamente al Persistence Context o dicho de otra manera, para actualizar una Entidad en estado atached.</p>
<p>Veamos un ejemplo de cómo persistiríamos una nueva Entidad:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true" title="CreateEmployee.java">package com.obb.jpa.jpaturorial.exercises;

import com.obb.jpa.jpaturorial.entity.Employee;
import com.obb.jpa.jpaturorial.entity.Status;
import com.obb.jpa.jpaturorial.util.EntityManagerUtil;
import java.util.Calendar;
import javax.persistence.EntityManager;

/**
 * @author Oscar Blancarte
 */
public class CreateEmployee {

    public static void main(String[] args) {
        //Create new EntityManager
        EntityManager manager = EntityManagerUtil.getEntityManager();

        //Open Trnsaction
        manager.getTransaction().begin();

        Employee employee = new Employee();
        employee.setName("Oscar Blancarte");
        employee.setRegistDate(Calendar.getInstance());
        employee.setSalary(1000);
        employee.setStatus(Status.ACTIVE);
        
        //Persist Employee
        manager.persist(employee);
       
        //Commit Transaction
        manager.getTransaction().commit();
    }
}</pre>
<p>&nbsp;</p>
<p>En las líneas 16 y 19 creamos el EntityManager y abrimos una nueva transacción, En las líneas 21 a 25, creamos un nuevo Empleado y establecemos sus propiedades, seguido utilizamos la instrucción <span class="lang:java decode:true crayon-inline ">manager.persist(employee)</span>  para marcar la entidad para ser persistida, finalmente en la línea 31 cerramos la transacción. Observemos que tan solo es necesario pasar la Entidad como parámetro para que JPA realice la inserción.</p>
<p>&nbsp;</p>
<h2>Método Merge</h2>
<p>La operación merge es utiliza para actualizar una entidad existente que no pertenece a un Contexto de persistencia. Esta operación la debemos utilizar cuando queremos actualizar una entidad que ya existe en la base de datos, pero por algún motivo, esta no está dentro del Contexto de Persistencia, este escenario se da cuando utilizamos DTO para viajar la información del FrontEnd al BackEnd, en donde convertimos el DTO a una Entidad y esta entidad ya existe en la base de datos. Veamos como utilizamos esta operación:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true" title="UpdateEmployee.java">package com.obb.jpa.jpaturorial.exercises;

import com.obb.jpa.jpaturorial.entity.Employee;
import com.obb.jpa.jpaturorial.entity.Status;
import com.obb.jpa.jpaturorial.util.EntityManagerUtil;
import java.util.Calendar;
import javax.persistence.EntityManager;

/**
 * @author Oscar Blancarte
 */
public class UpdateEmployee {
    public static void main(String[] args) {
        //Create new EntityManager
        EntityManager manager = EntityManagerUtil.getEntityManager();
        
        //Query Employee by ID
        
        //Open Transaction
        manager.getTransaction().begin();
        
        //Set Employee Status
        Employee employee = new Employee();
        employee.setId(1L);
        employee.setName("Oscar Blancarte");
        employee.setRegistDate(Calendar.getInstance());
        employee.setSalary(1000);
        employee.setStatus(Status.INACTIVE);
        
        //Update Employee Status
        manager.merge(employee);
        
        //Commit changes
        manager.getTransaction().commit();
    }
}</pre>
<p>&nbsp;</p>
<p>Veamos que este ejemplo es prácticamente igual al ejemplo de la operación persist, sin embargo, existe una gran diferencia, en la línea 24 establecemos el ID de la entidad, lo que significa que cuando se realice el Merge, este se realice sobre el mismo registro. La segunda diferencia está en la línea 31, donde utilizamos la operación <span class="lang:java decode:true crayon-inline ">manager.merge(employee)</span> .</p>
<p>&nbsp;</p>
<h2>Método Find</h2>
<p>&nbsp;</p>
<p>Esta operación es básica para buscar una Entidad solamente por su ID, mediante esta operación es posible recuperar la Entidad de la base de datos. Recordemos que una Entidad puede tener un ID de un solo campo o tener una llave compuesta, mediante <span class="lang:java decode:true crayon-inline ">@IdClass</span>  y<span class="lang:java decode:true crayon-inline">@EmbeddedId</span>, cuando se trata de una llave simple, solo será necesario consultar la entidad por el valor de la llave primaria, sin embargo, cuando la llave es compuesta, el parámetro deberá ser del tipo de la llave primaria, es decir de la clase marcada como <span class="lang:java decode:true crayon-inline ">@IdClass</span>  o <span class="lang:java decode:true crayon-inline ">@EmbeddedId</span> . Veamos un ejemplo de cómo quedaría:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true " title="ReadEmploye.java">package com.obb.jpa.jpaturorial.exercises;

import com.obb.jpa.jpaturorial.entity.Employee;
import com.obb.jpa.jpaturorial.util.EntityManagerUtil;
import javax.persistence.EntityManager;

/**
 * @author Osccar Blancarte
 */
public class ReadEmployee {
    public static void main(String[] args) {
        //Create new EntityManager
        EntityManager manager = EntityManagerUtil.getEntityManager();
        
        //Query Employee by ID
        Employee employee = manager.find(Employee.class, 1);
        
        //Print name of Employee
        System.out.println("Employee name ==&gt; " + employee.getName());
    }
}</pre>
<p>&nbsp;</p>
<p>Veamos que la operación find requiere dos parámetros, el primero es la clase de la entidad que esperamos buscar y el segundo valor es el ID. En este caso se trata de una llave simple, por lo que con mandar el valor 1 será suficiente, sin embargo, como mencione anteriormente, en caso se ser compuesta, deberemos mandar la clase que corresponde con la llave primaría.</p>
<p>Como resultado, la operación find retornara la Entidad con el ID = 1 con todas sus propiedades.</p>
<p>&nbsp;</p>
<h2>Método Remove:</h2>
<p>&nbsp;</p>
<p>La operación remove es muy simple, pues solo es requerido enviar la Entidad que se desea remover. La Entidad tendrá que estar dentro del contexto de persistencia para poder ser eliminada, de lo contrario nos arrojara una excepción. Veamos cómo utilizar esta operación:</p>
<p>&nbsp;</p>
<pre class="lang:java decode:true " title="DeleteEmployee.java">package com.obb.jpa.jpaturorial.exercises;

import com.obb.jpa.jpaturorial.entity.Employee;
import com.obb.jpa.jpaturorial.util.EntityManagerUtil;
import javax.persistence.EntityManager;

/**
 * @author Oscar Blancarte
 */
public class DeleteEmployee {
    public static void main(String[] args) {
        //Create new EntityManager
        EntityManager manager = EntityManagerUtil.getEntityManager();
        
        //Query Employee by ID
        Employee employee = manager.find(Employee.class, 1L);
        
        //Open transaction
        manager.getTransaction().begin();
                
        //Delete Employee
        manager.remove(employee);
        
        //Commit transaction
        manager.getTransaction().commit();
    }
}</pre>
<p>&nbsp;</p>
<p>Lo primero que hacemos es consultar al Empleado mediante el la operación find, esto debidos a que la debemos de tener dentro del contexto de persistencia, seguido en la línea 22 ejecutamos la operación <span class="lang:java decode:true crayon-inline">manager.remove(employee</span>  lo cual provocara que la entidad sea eliminada de la base de datos y del contexto de persistencia.</p>
<p>&nbsp;</p>
<h2>Método Refresh:</h2>
<p>Operación que permite actualizar la Entidad con la base de datos, tan solo es necesario mandar como parámetro la Entidad a actualizar, esto actualizará todos los atributos con los de la base de datos:</p>
<pre class="lang:java decode:true">manager.refresh(employee);</pre>
<p>No regresa nada, pues actualiza la misma entidad que se envió como parámetro.</p>
<p>&nbsp;</p>
<h2>Método Detach:</h2>
<p>Operación que permite sacar una Entidad del Contexto de persistencia. Todo cambio realizado en la entidad será descartado al terminar la transacción.</p>
<pre class="lang:java decode:true">manager.detach(employee);
</pre>
<p>La entidad queda en estado detached una vez ejecutada esta instrucción.</p>
<p>&nbsp;</p>
<h2>Método Clear:</h2>
<p>Limpia el Contexto de Persistencia, por lo que todas las entidades pasarán al estado detached</p>
<pre class="lang:java decode:true">Manager.clear();
</pre>
<p>Todos los cambios realizados en la transacción serán desechados.</p>
<p>&nbsp;</p>
<h2>Método Contains:</h2>
<p>Operación que permite saber si una entidad se encuentra en el Contexto de persistencia. Se envía la Entidad a validar y retorna una booleano, indicando si está o no en el Contexto de Persistencia.</p>
<pre class="lang:java decode:true">boolean exist = manager.contains(employee);
</pre>
<p>&nbsp;</p>
<p>Existen muchas operaciones más que nos proporciona el EntityManager, pero estas las veremos gradualmente durante el desarrollo de este tutorial.</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/12/05/ciclo-vida-las-entidades/">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/02/21/entitymanager-persistencecontext/">Siguiente </a></center>		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/12/operaciones-basicas/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1110</post-id>	</item>
		<item>
		<title>Ciclo de vida de las Entidades</title>
		<link>https://www.oscarblancarteblog.com/2016/12/05/ciclo-vida-las-entidades/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/05/ciclo-vida-las-entidades/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 05 Dec 2016 09:00:25 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1267</guid>

					<description><![CDATA[Entender el ciclo de vida de las Entidades es sin duda uno de los puntos cruciales de JPA, pues entender cómo es que una Entidad es gestionada por EntityManager nos permitirá entender mejor como es que JPA funciona y prevenir muchos errores en tiempo de ejecución. Lo primero que debemos de entender, es que todas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" decoding="async" class="alignleft wp-image-603 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA persistence.xml" width="150" height="83" /></p>
<p>Entender el ciclo de vida de las Entidades es sin duda uno de los puntos cruciales de JPA, pues entender cómo es que una Entidad es gestionada por EntityManager nos permitirá entender mejor como es que JPA funciona y prevenir muchos errores en tiempo de ejecución.</p>
<p>Lo primero que debemos de entender, es que todas entidades que utilicemos con JPA, serán administradas por el EntityManager, es por este motivo que hemos agregado este esta sección al capítulo de EntityManager.</p>
<p>&nbsp;</p>
<h2>Persistence Context:</h2>
<p>Antes de entrar a los estados de las Entidades es importante entender un nuevo concepto que no hemos analizados en esta guía, se trata del Contexto de persistencia (Persistence Context), este lo podemos ver como contenedor en donde se encuentra todas las Entidades administradas por el EntityManager. Cuando un nuevo EntityManager es creado a través del EntityManagerFactory este le asigna un Unidad de persistencia.<span id="more-1267"></span></p>
<p><figure id="attachment_1265" aria-describedby="caption-attachment-1265" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-1265 size-large" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/persistencecontext-1024x642.png" alt="Ciclo de vida de las Entidades" width="648" height="406" /><figcaption id="caption-attachment-1265" class="wp-caption-text">Ciclo de vida de las Entidades</figcaption></figure></p>
<p>Cabe mencionar que el Persistence Context no es un objeto con el cual nosotros interactuaremos, ya que este esta encapsulado dentro de Entity Manager y solo a través de este es posible afectarlo. En la siguiente sección hablaremos de las operaciones que ofrece el Entity Manager y con las cuales es posible afectar a Unidad de persistencia y las entidades.</p>
<h2>Estados de las entidades:</h2>
<p>A medida que trabajamos con las entidades, estas van cambiando de estado, y el estado de estas será utilizado para realizar operaciones en la base de datos. Un aspecto importante cuando utilizamos JPA es que ya no estamos trabajando con sentencias SQL y en su lugar trabajamos con las Entidades y sus estados. Las entidades en JPA puedan pasar por cuatro estados distintos que se pueden ver en la siguiente imagen:</p>
<p><figure id="attachment_1266" aria-describedby="caption-attachment-1266" style="width: 648px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-1266 size-large" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/lifecicle-1024x510.png" alt="Ciclo de vida de las Entidades" width="648" height="323" /><figcaption id="caption-attachment-1266" class="wp-caption-text">Estados de las Entidades</figcaption></figure></p>
<p>Los cuatro estados son:</p>
<ul>
<li><strong>New:</strong> Estado que tiene una entidad cuando es creada con el operador new, por lo tanto, no existe en la base de datos y no está asociada a un contexto de persistencia. Todas las entidades en estado new no serán afectadas en la base de datos cuando la transacción finalice, pues no está asociado a al Context Persistence.</li>
<li><strong>Manage:</strong> Todas las entidades que están siendo administradas por JPA están en estado manage, lo que indica que son parte de un contexto de persistencia. Aplica para entidades que serán insertadas, actualizadas o fueron obtenidas por el EntityManager como parte de alguna operación SELECT.</li>
<li><strong>Detached:</strong> Las entidades en estado detached, son entidades que si existen en la base de datos, pero por algún motivo no son parte de un contexto de persistencia. Todas las entidades en este estatus no serán afectadas en la base de datos, pues no pertenecen a un Persistence Context</li>
<li><strong>Removed:</strong> Cuando una Entidad es marcada para ser eliminada, pasa automáticamente al estado de Removed. Cando la transacción finaliza, todas las Entidades en este status serán eliminadas de la base de datos y ya no existirán más en el Persistence Context.</li>
</ul>
<p>En la siguiente sección hablaremos de las operaciones básicas que nos permite utilizar el EntityManager y con las cueles es posible mover de estados las entidades. Por lo pronto es importante entender los estados por lo que pueden pasar las entidades para que nos facilite entender las operaciones para buscar, persistir, actualizar y borrar de JPA.</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/30/atributos-volatiles-transient/">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/12/12/operaciones-basicas/">Siguiente </a></center>		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/05/ciclo-vida-las-entidades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1267</post-id>	</item>
		<item>
		<title>Atributos volátiles con @Transient</title>
		<link>https://www.oscarblancarteblog.com/2016/11/30/atributos-volatiles-transient/</link>
					<comments>https://www.oscarblancarteblog.com/2016/11/30/atributos-volatiles-transient/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 30 Nov 2016 15:00:55 +0000</pubDate>
				<category><![CDATA[JPA]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1238</guid>

					<description><![CDATA[La anotación @Transient se utiliza para indicarle a JPA que un atributo de una Entidad no debe de ser persistente, de esta manera, JPA pasa por alto el atributo y no es tomado en cuenta a la hora de persistir el Objeto. En la práctica no es común utilizar esta anotación, debido a que las [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" 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" />La anotación @Transient se utiliza para indicarle a JPA que un atributo de una Entidad no debe de ser persistente, de esta manera, JPA pasa por alto el atributo y no es tomado en cuenta a la hora de persistir el Objeto.</p>
<p>En la práctica no es común utilizar esta anotación, debido a que las Entidades por lo general solo tiene los atributos que mapean con la base de datos. Sin embargo, existen ocasiones en donde puede ser útil. Un ejemplo muy habitual es cuando agregamos un logger a la clase entidad. Esta instancia de java.util.logging.Logger será una propiedad más de la entidad, pero no deseamos que sea persistente, para lo cual lo marcamos con @Transient. Retomaremos la Entidad Employee que hemos utilizado en todo este tutorial para analizar cómo quedaría:</p>
<p><span id="more-1238"></span></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 java.util.logging.Logger;
import javax.persistence.*;

/**
 * @author Oscar Blancarte
 */
@Entity
@Table(
    name = "EMPLOYEES" , 
    schema = "jpatutorial", 
    indexes = {@Index(name = "name_index", columnList = "name",unique = true)}
)
public class Employee {
    
    @Transient
    private static final Logger logger = Logger.getLogger(Employee.class.getSimpleName());
    
    @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>Como vemos en la entidad Employee, marcamos la propiedad logger como @Transiente, de esta manera, este atributo será ignorado por JPA. Si ejecutamos el programa veremos que no se creara una columna para esta propiedad.</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" decoding="async" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="auto, (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 decoding="async" 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 decoding="async" 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 decoding="async" 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 decoding="async" 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>La anotación @Transient no tiene atributos, por lo que con solo agregarla JPA sabrá que debe ignorar el campo.</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="www.oscarblancarteblog.com/2016/11/29/trabajar-objetos-pesados-lob/">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/12/05/ciclo-vida-las-entidades/">Siguiente </a></center></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/11/30/atributos-volatiles-transient/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1238</post-id>	</item>
	</channel>
</rss>
