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

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

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

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



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



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



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



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



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



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

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

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

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



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



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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<h2>Conclusiones</h2>



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



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

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



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



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



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



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



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



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

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

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

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



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



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



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

import javax.persistence.*;

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

}</code></pre>



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



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



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



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



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

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

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

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

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



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



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



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



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



<h2>Conclusiones</h2>



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



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



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/">Relaciones @OneToMany</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/20/relaciones-onetomany/feed/</wfw:commentRss>
			<slash:comments>18</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2555</post-id>	</item>
		<item>
		<title>Relaciones @OneToOne</title>
		<link>https://www.oscarblancarteblog.com/2018/12/14/relaciones-onetoone/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/14/relaciones-onetoone/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 14 Dec 2018 16:00:51 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2499</guid>

					<description><![CDATA[<p>Las relaciones One to One (@OneToOne) se caracterizan porque solo puede existir una y solo una relación con la Entidad de destino, de esta forma, la entidad marcada como @OnoToOne deberá tener una referencia a la Entidad destino y por ningún motivo podrá ser una colección. De la misma forma, la Entidad destino no podrá [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/14/relaciones-onetoone/">Relaciones @OneToOne</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jpa-onetoone-1024x575.jpg" alt="" class="wp-image-2500"/></figure>



<p>Las relaciones One to One (<em>@OneToOne</em>) se caracterizan porque solo puede existir una y solo una relación con la Entidad de destino, de esta forma, la entidad marcada como <em>@OnoToOne</em> deberá tener una referencia a la Entidad destino y por ningún motivo podrá ser una colección. De la misma forma, la Entidad destino no podrá pertenecer a otra Instancia de la Entidad origen.</p>



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



<p>Solo para ponernos en contexto, las relaciones <code>@OneToOne</code> se utilizan cuando existe una profunda relación entre la Entidad origen y destino,de tal forma que la entidad destino le pertenece a la Entidad origen y solo a ella, por ende, la existencia de la entidad destino depende de la Entidad origen.</p>



<p>Para comprender mejor todo este trabalenguas, analicemos el caso práctico de una factura, cuando creamos una factura, la llevamos con nuestro cliente para que la pague, este pago puede ser una entidad por separada que lleve el control de la fecha de pago, monto pagado, método de pago, etc. Veamos como quedarían esta Entidades</p>



<p><strong>Entidad Invoice:</strong></p>



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

import java.util.Calendar;
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;

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



<p><strong>Entidad Payment:</strong></p>



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

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

/**
 * @author Oscar Blancarte &lt;oscarblancarte3@gmail.com>
 */
@Entity
@Table(name = "payments")
public class Payment {
    
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="PAY_DATE", nullable = false, updatable = false)
    private Calendar payDate;
    
    @Column(name = "AMOUNT", nullable = false, updatable = false)
    private double amount;
    
    @Column(name = "PAY_METHOD", nullable = false, updatable = false)
    private PaymentMethod paymentMethod;
    
    @OneToOne
    @JoinColumn(name = "FK_INVOICE", updatable = false, nullable = false)
    private Invoice invoice;

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



<p>Estas dos Entidades
crearán las siguientes tablas:</p>



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



<p>Como podemos observar, la tabla <em>payments </em>tiene la columna <em>FK_INVOICE</em> que hace relación con la tabla invoices. </p>



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



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



<p>Algo que hay que tomar en cuenta, es que tanto la Entidad <code>Invoice</code> como <code>Payment</code> tiene anotada como <code>@OneToOne</code> a la otra entidad, sin embargo, solo payments ha creado la columna para hacer el JOIN, esto se debe a que esta es la que tiene la anotación <code>@JoinColumn</code>, la cual nos permite establecer como se llamará la columna para realizar el JOIN, adicional, la Entidad <code>Invoice</code> tiene definida la propiedad <code>mappedBy</code> de la anotación <code>@OneToOne</code>, esta propiedad es muy importante, pues le permite hacer una relación bidireccional, si no la pusiéramos, JPA agregaría una columna adicional en la tabla <em>invoices</em>, y guardaría el pago como un nuevo registro.</p>



<p>Veamos un ejemplo de cómo se crearía un registro con esta relación:</p>



<pre class="wp-block-code"><code class="">public static void main(String[] args) {
        EntityManager manager = EntityManagerUtil.getEntityManager();
        
        Customer customer = new Customer();
        customer.setName("Oscar Blancarte");
        
        Payment payment = new Payment();
        payment.setAmount(100);
        payment.setPayDate(Calendar.getInstance());
        payment.setPaymentMethod(PaymentMethod.CASH);
                
        
        Invoice invoice = new Invoice();
        invoice.setCustomer(customer);
        invoice.setRegistDate(Calendar.getInstance());
        invoice.setStatus(Status.ACTIVE);
        
        payment.setInvoice(invoice);
        invoice.setPayment(payment);
        
        manager.getTransaction().begin();
        manager.persist(invoice);
        manager.getTransaction().commit();
    }</code></pre>



<p>Dando como resultado lo siguiente:</p>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/payments-table.jpg" alt="JPA OneToOne payments table" class="wp-image-2509"/><figcaption>Tabla payments</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoices-table.jpg" alt="JPA OneToOne invoices table" class="wp-image-2510"/><figcaption>Tabla invoices</figcaption></figure></div>



<h2>Conclusiones</h2>



<p>Crear relaciones OneToOne es muy simple como hemos podido comprobar, e incluso, podríamos crear una relación unidireccionar omitiendo la propiedad payment de la entidad <code>Invoice</code>, lo que diera como resultado exactamente la misma estructura de base de datos, con la única limitante que no podríamos recuperar el pago por medio de la factura y es por ello que utilizamos relacionar bidireccionales con <code>mappedBy</code>.<br><br></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/13/personalizar-las-relaciones-con-joincolumn/">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/20/relaciones-onetomany/">Siguiente </a></center>



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

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

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

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

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

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "CUSTOMERS")
public class Customer {
    
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    @Column(name = "NAME", nullable = false, length = 100)
    private String name;

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


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



<div style="height:87px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/">Relación muchos a uno con @ManyToOne</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/06/relacion-muchos-a-uno-con-manytoone/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2449</post-id>	</item>
		<item>
		<title>MongoDB Atlas – Database as a Service</title>
		<link>https://www.oscarblancarteblog.com/2018/07/24/mongodb-atlas-database-as-a-service/</link>
					<comments>https://www.oscarblancarteblog.com/2018/07/24/mongodb-atlas-database-as-a-service/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 24 Jul 2018 09:00:10 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[mongodb]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2139</guid>

					<description><![CDATA[<p>Hasta hace poco, tener una base de datos 100% funcional y perfectamente administrada, era casi imposible o todo un reto, pues se requiere personal altamente calificado para entender las señales sutiles que una base de datos nos arroja a medida que el performance de degrada, se incrementa el número de usuarios simultáneos o el Disco [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/07/24/mongodb-atlas-database-as-a-service/">MongoDB Atlas – Database as a Service</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter wp-image-2149 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/banner-2-1024x573.png" alt="" width="648" height="363" />Hasta hace poco, tener una base de datos 100% funcional y perfectamente administrada, era casi imposible o todo un reto, pues se requiere personal altamente calificado para entender las señales sutiles que una base de datos nos arroja a medida que el performance de degrada, se incrementa el número de usuarios simultáneos o el Disco duro se llena, etc. Es por esta razón que MongoDB lanza la plataforma <a href="https://mbsy.co/jJ6rF">MongoDB Atlas</a>, la cual es una base de datos como Servicio (DaS).<span id="more-2139"></span></p>
<p>&nbsp;</p>
<p>Las bases de como servicio también son parte de los <a href="https://www.oscarblancarteblog.com/2018/06/18/backend-as-service-baas/">Backend as a Service</a> (BaaS).</p>
<p>&nbsp;</p>
<h2>Que es MongoDB Atlas</h2>
<p><a href="https://mbsy.co/jJ6rF">MongoDB Atlas</a> es el primer servicio de “Database as a Services” (DaS) para bases de datos MongoDB, en el cual es posible crear completos clusteres (Replica Set) de bases de datos, con unos cuantos click y exponerlas por internet para contactar nuestras aplicaciones si la necesidad de las tareas de instalación y administración.</p>
<p>&nbsp;</p>
<h2>Como funciona MongoDB Atlas</h2>
<p>MongoDB Atlas es una plataforma autogestionado, lo que quiere decir que ellos se encargarán de absolutamente todos los aspectos relacionados al hosting, instalación y actualizaciones, de tal forma que nosotros solo nos encargamos de las configuraciones más básicas, como gestionar los accesos, crear las bases de datos, crear alertas, etc.</p>
<p>&nbsp;</p>
<h2>Como crear un cluster</h2>
<p>Crear un Cluster es sumamente fácil, pues solo se tiene que realizar unos simple pasos. El primero es seleccionar el hosting. Los proveedores soportados son Amazon Web Services (AWS), Google Cloud Platform, Microsoft Azure:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2140" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/1-MongoDB-Atlas-Hosting.png" alt="" width="852" height="164" /></p>
<p>El segundo paso es seleccionar la región en la que estará “hosteado” nuestra Base de datos. La ubicación es muy importante para mejorar el performance de nuestra aplicación, por lo que tendremos que seleccionar la esté más cercas de nuestra aplicación o de nuestros usuarios.</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2141" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/2-MongoDB-Atlas-Region.png" alt="" width="807" height="439" /></p>
<p>El siguiente paso es seleccionar las características del servidor, entre los que tenemos un cluster totalmente gratuito:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2142" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/3-MongoDB-Atlas-Planes.png" alt="" width="811" height="617" /></p>
<p>Finalmente es posible establecer algunas configuraciones adicionales, como el backup, la versión de MongoDB, seleccionar el nombre del custer, etc.</p>
<p>Una vez creado el cluster es posible monitorearlo y sabes datos como el número de operaciones y número de conexiones</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2143" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/4-MongoDB-Atlas-Dashboard.png" alt="" width="1036" height="507" /></p>
<h2></h2>
<h2>Conectarnos la MongoDB Atlas:</h2>
<p>El paso final será conectarnos a la base de datos, para eso, MongoDB Atlas nos ofrece la opción de conectarnos mediante la herramienta Mongo Shell, conectar nuestra aplicación mediante un Driver o utilizar un cliente como Compas:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2144" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/07/5-MongoDB-connect.png" alt="" width="672" height="706" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><figure id="attachment_2293" aria-describedby="caption-attachment-2293" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="" width="648" height="249" /></a><figcaption id="caption-attachment-2293" class="wp-caption-text">¿Quieres aprender a crear un API REST con NodeJS &amp; MongoDB Atlas? te recomiendo mi nuevo libro.</figcaption></figure></p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como podrás ver, utilizar MongoDB Altas es sumamente fácil, pues solo nos preocupamos por desarrollar nuestra aplicación, en lugar de perder tiempo en gestionar e instalar nuestra base de datos, al mismo tiempo que Atlas se encargar de asegurar la alta disponibilidad de la base de datos.</p>
<p>Aprende más sobre MongoDB y MongoDB Atlas en mi libro &#8220;<a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb">Aplicaciones Reactivas con React, NodeJS &amp; MongoDB</a>&#8221;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/07/24/mongodb-atlas-database-as-a-service/">MongoDB Atlas – Database as a Service</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/07/24/mongodb-atlas-database-as-a-service/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2139</post-id>	</item>
		<item>
		<title>MongoDB y el paradigma NoSQL</title>
		<link>https://www.oscarblancarteblog.com/2017/12/05/mongodb-paradigma-nosql/</link>
					<comments>https://www.oscarblancarteblog.com/2017/12/05/mongodb-paradigma-nosql/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 05 Dec 2017 10:00:43 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[mongodb]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1943</guid>

					<description><![CDATA[<p>Hoy en día hablar de bases de datos sin pensar en Tablas y Columnas es muy difícil de imaginas, pues la gran mayoría de nosotros crecimos con bases de datos relacionales, como lo son Oracle, MySQL y SQL Server. Sin embargo, como todas las tecnologías, llega el momento, en que nuevas tecnologías, van desplazando a [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/12/05/mongodb-paradigma-nosql/">MongoDB y el paradigma NoSQL</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter wp-image-1944" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/12/banner.png" alt="MongoDB y el paradigma NoSQL" width="743" height="420" /></p>
<p>Hoy en día hablar de bases de datos sin pensar en Tablas y Columnas es muy difícil de imaginas, pues la gran mayoría de nosotros crecimos con bases de datos relacionales, como lo son Oracle, MySQL y SQL Server. Sin embargo, como todas las tecnologías, llega el momento, en que nuevas tecnologías, van desplazando a las anteriores.<span id="more-1943"></span></p>
<p>Así como las bases de datos relacionales remplazaron a las bases de datos sobre archivos de texto plano, las bases de datos no estructuras están empezando a tomar un protagonismo muy importante, incluso, es posible que, en un futuro no muy lejana, las bases de datos NoSQL empiecen a remplazar desplazar a las bases de datos tradicionales.</p>
<p>Hoy en día, han surgido barías propuestas alternativas al modelo SQL, como lo son, Base de datos de Objectos (ObjectDB), Bases de datos de clave-valor (Cassandra), base de datos en tiempo real (Firebase) y bases de datos de documentos (MongoDB), las cuales, a pesar de trabajar de forma diferente, tiene algo en común, y es que todas son Bases de datos NoSQL.<!--more--></p>
<p>Este solo un es fragmento de mi articulo en la revista Centripio Magazine, te invito a que la descargues y te suscribas.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/12/05/mongodb-paradigma-nosql/">MongoDB y el paradigma NoSQL</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/12/05/mongodb-paradigma-nosql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1943</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[<p>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;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/">JPA &#8211; Resource Local transaction</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter wp-image-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>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/03/09/jpa-resource-local-transaction/">JPA &#8211; Resource Local transaction</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/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>Crear un proyecto JPA</title>
		<link>https://www.oscarblancarteblog.com/2016/10/25/crear-proyecto-jpa/</link>
					<comments>https://www.oscarblancarteblog.com/2016/10/25/crear-proyecto-jpa/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 25 Oct 2016 09:00:50 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=976</guid>

					<description><![CDATA[<p>En la actualidad existe diversos IDE’s que nos permitirán crear proyecto JPA y en general todos ofrecen las mismas opciones por lo que en realidad sea cual sea el IDE que quieras utilizar tendrá el mismo resultado, sin embargo, para este tutorial utilizaremos NetBeans, el cual lo puedes descargar en http://netbeans.org. NetBeans es un proyecto [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/10/25/crear-proyecto-jpa/">Crear un proyecto JPA</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-603 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="Tutorial de JPA" width="150" height="83" />En la actualidad existe diversos IDE’s que nos permitirán crear proyecto JPA y en general todos ofrecen las mismas opciones por lo que en realidad sea cual sea el IDE que quieras utilizar tendrá el mismo resultado, sin embargo, para este tutorial utilizaremos NetBeans, el cual lo puedes descargar en <a href="http://netbeans.org">http://netbeans.org</a>. NetBeans es un proyecto OpenSource por lo que lo podrás descargar libremente y sin ningún costo.</p>
<p>Ahora bien, para maximizar la portabilidad y facilitar las librerías utilizaremos un <a href="https://maven.apache.org/">Maven</a>, la cual es una herramienta para la gestión de dependencias y construcción de proyectos similar a Apache Ant, aunque más potente. Si quieres aprender más de Maven te recomiendo el libro <a href="https://www.amazon.com.mx/gp/product/0596517335/ref=as_li_ss_tl?ie=UTF8&amp;camp=1789&amp;creative=390957&amp;creativeASIN=0596517335&amp;linkCode=as2&amp;tag=oscarblancart-20">Maven: The Definitive Guide</a>.</p>
<p>Por el momento no te preocupes si no has trabajado con NetBeans o Maven, ya que aquí mismo te diremos paso a paso como hacer todos los pasos para configurar tu proyecto.</p>
<h2>Creando un proyecto Maven</h2>
<p>Lo primero que tendremos que hacer será abrir NetBeans y en el menú superior pincharemos la opción File &gt;New Project  y nos arrojara la siguiente pantalla:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/NewProject.png"><img loading="lazy" class="size-full wp-image-980 aligncenter" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/NewProject.png" alt="Projecto JPA - Nuevo" width="727" height="510" /></a><span id="more-976"></span></p>
<p>De la lista de categorías seleccionemos <strong>Maven</strong> y en la lista Projects, selecciones <strong>Java Application</strong>, seleccionamos Next y nos arrojara la siguiente pantalla:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/NewProject2.png"><img loading="lazy" class="size-full wp-image-981 aligncenter" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/NewProject2.png" alt="Proyecto JPA - Maven" width="728" height="510" /></a></p>
<p>En esta nueva pantalla configuraremos el nombre del proyecto y los demás datos necesarios para la generación de los Artefactos de Maven, en este caso, capturemos los datos como aparecen en la imagen. No te preocupes si no comprendes Maven, solo sigue la guía y te explicaremos todo lo que sea relevante para la configuración. Finalmente, presiona Finish para finalizar el wizard y crear nuestro proyecto.</p>
<p>Ya en este punto nuestro proyecto JPATutorial esta creado y lo puedes visualizar en la sección izquierda del IDE. Por ahora es tan solo un proyecto Java por lo que solo tendremos disponibles las librerías del JRE Estándar Edition. JPA por otra parte es parte de la especificación de Java EE por lo que será necesario realizar la importación de las librerías adecuadas. Es en este punto donde Maven hace su magia.</p>
<p>Para importar las librerías de JPA será necesario seleccionar la carpeta Dependencias que aparece dentro del proyecto y seleccionamos la opción Add Dependency y nos aparecerá una pantalla como la siguiente:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/AddLibrary.png"><img loading="lazy" class="size-full wp-image-978 aligncenter" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/AddLibrary.png" alt="Projecto JPA - Agregar dependencia" width="593" height="569" /></a></p>
<p>Escribimos EclipseLink en el campo Query y presionamos enter, esto iniciara una búsqueda de todas las librerías registradas en los repositorios de Maven, la primera vez que realizamos una búsqueda puede tardar un tiempo considerable, debido a que debe de descargar todo el listado de dependencias. Una vez que arroja los resultados, expandimos el ítem org.eclipse.persistence : eclipselink, y nos arrojara una serie de artefactos, seleccionamos la última versión disponible  del JAR, en este caso, sería la 2.6.4 [jar] y presionamos Add, este proceso iniciara con la descarga de las dependencias de forma automática y las registrara en nuestro proyecto.</p>
<p>Tras esperar un momento a que se descarguen las librerías, podrás ver dentro de la carpeta Dependencies todas las librerías descargadas, y tu proyecto se deberá de ver de la siguiente manera:</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/AddLibrary2.png"><img loading="lazy" class="aligncenter size-full wp-image-979" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/10/AddLibrary2.png" alt="Proyecto JPA - Eclipselink" width="269" height="236" /></a></p>
<p>Repetiremos los pasos anteriores para agregar el driver de MySQL, y así poder establecer conexión más adelante, en este caso buscamos mysql y seleccionamos el ítem mysql: mysql-connector-java, seleccionamos la versión que adapte a la versión de MySQL que estamos utilizando, en este caso es la 6.0.4 [jar]</p>
<p>Finalmente, el archivo pom.xml que se encuentra en la carpeta Project Files se vera de la siguiente manera:</p>
<pre class="lang:xhtml decode:true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&gt;
    &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
    &lt;groupId&gt;com.obb.jpa&lt;/groupId&gt;
    &lt;artifactId&gt;JPATurorial&lt;/artifactId&gt;
    &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;
    &lt;packaging&gt;jar&lt;/packaging&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.eclipse.persistence&lt;/groupId&gt;
            &lt;artifactId&gt;eclipselink&lt;/artifactId&gt;
            &lt;version&gt;2.6.4&lt;/version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;properties&gt;
        &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
        &lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt;
        &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;
    &lt;/properties&gt;
&lt;/project&gt;</pre>
<p>NOTA: El archivo POM es generado para todos los proyectos Maven y es desde este archivo donde se configuran las dependencias, las instrucciones de generación del proyecto y hasta la forma de ejecución/despliegue de la aplicación.</p>
<p><strong>Tambíen los quiero invitar a ver mi curso de JPA, donde explico todos estos temas aplicados con API REST, </strong><a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label=" (opens in a new tab)"><strong>https://codmind.com/courses/jpa</strong></a></p>
<figure class="wp-block-image"><a href="https://codmind.com/courses/jpa" target="_blank" rel="noopener noreferrer"><img loading="lazy" width="800" height="450" class="wp-image-3085 lazy-loaded" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" sizes="(max-width: 800px) 100vw, 800px" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md-768x432.jpg 768w" alt="" data-lazy-type="image" data-src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/06/banner-md.jpg" data-srcset="" /></a><figcaption><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" alt="👉" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f449.svg" /> Los invito a mi <a href="https://codmind.com/courses/jpa" target="_blank" rel="noreferrer noopener" aria-label="Curso de Mastering JPA (opens in a new tab)">Curso de Mastering JPA</a>, donde habla de todos estos temas y crearemos un API REST para probar todos los conceptos de persistencia.<br />
<img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /><img class="emoji lazy-loaded" draggable="false" src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" alt="👈" data-lazy-type="image" data-src="https://s.w.org/images/core/emoji/11.2.0/svg/1f448.svg" /></figcaption></figure>
<p>En este punto, nuestro proyecto JPA está listo para poder empezar a utilizar JPA, en la siguiente sección nos introduciremos en la clase EntityManager y la configuración del archivo persistence.xml</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><br />
<a class="btn btn-default read-more disabled" style="display: inline-block; float: none; margin-right: 15px; background-color: #da4453;" href="#"> 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/10/26/entitymanager-archivo-persistence-xml/">Siguiente </a></center></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/10/25/crear-proyecto-jpa/">Crear un proyecto JPA</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/10/25/crear-proyecto-jpa/feed/</wfw:commentRss>
			<slash:comments>19</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">976</post-id>	</item>
		<item>
		<title>2Phase Commit</title>
		<link>https://www.oscarblancarteblog.com/2014/09/19/data-base-2phase-commit-en-ambientes-distribuidos/</link>
					<comments>https://www.oscarblancarteblog.com/2014/09/19/data-base-2phase-commit-en-ambientes-distribuidos/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 19 Sep 2014 10:00:00 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[2phase commite]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/?p=383</guid>

					<description><![CDATA[<p>Hoy en día casi todas las aplicaciones utilizan bases de datos para almacenar y transaccionar la información, sin embargo casi todas las aplicaciones tiene como origen de datos una sola base de datos centralizada, en donde guardan toda la información, actualizan o borran, para lo cual una sola transacción garantiza que todos los cambios que realicemos [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/09/19/data-base-2phase-commit-en-ambientes-distribuidos/">2Phase Commit</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><img loading="lazy" class="alignleft wp-image-730 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/database-administration21-e1438489477397.jpg" alt="" width="160" height="100" />Hoy en día casi todas las aplicaciones utilizan bases de datos para almacenar y transaccionar la información, sin embargo casi todas las aplicaciones tiene como origen de datos una sola base de datos centralizada, en donde guardan toda la información, actualizan o borran, para lo cual una sola transacción garantiza que todos los cambios que realicemos se apliquen de forma atómica.<span id="more-383"></span></p>
<p><figure id="attachment_384" aria-describedby="caption-attachment-384" style="width: 371px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/commitsimple.png"><img loading="lazy" class="wp-image-384 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/commitsimple.png" alt="2Phase commit" width="371" height="147" /></a><figcaption id="caption-attachment-384" class="wp-caption-text">Fig. 1: En la figura se puede apreciar como la aplicación abre una transacción única, de esta forma todos los cambios serán aplicados de forma atómica.</figcaption></figure></p>
<p>&nbsp;</p>
<p style="text-align: justify;">Sin embargo existen casos concretos en los que es necesario actualizar mas de una base datos en una sola operación, un caso muy tipo es <a href="http://www.oscarblancarteblog.com/2014/07/23/que-es-service-oriented-architecture-soa/">SOA</a>, debido a que es común la necesidad de transaccionar con mas de una base de datos al mismo tiempo.</p>
<p><figure id="attachment_386" aria-describedby="caption-attachment-386" style="width: 366px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/twocommitsimple1.png"><img loading="lazy" class="wp-image-386 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/twocommitsimple1.png" alt="2Phase commit" width="366" height="291" /></a><figcaption id="caption-attachment-386" class="wp-caption-text">Fig. 2: La imagen muestra como una aplicación realiza cambios en dos bases de datos a la vez, pero los realiza en dos transacciones independientes.</figcaption></figure></p>
<p style="text-align: justify;">Este tipo de transacciones pueden ser delicadas debido a que si hacemos commit en la primera, pero la segunda falla, tendremos un problema de integridad, ya que la primera base de datos habrá aplicados los cambios en el commit y la segunda base de datos realizara un RollBack, deshaciendo todos los cambios.</p>
<p><figure id="attachment_388" aria-describedby="caption-attachment-388" style="width: 367px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/twocommitsimplefail.png"><img loading="lazy" class="wp-image-388 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/twocommitsimplefail.png" alt="2Phase commit" width="367" height="284" /></a><figcaption id="caption-attachment-388" class="wp-caption-text">Fig. 3: En la imagen se muestra como una transacción fue exitosa y la otra no, esto desde luego provoca que perdamos la integridad de los datos.</figcaption></figure></p>
<h2>2Phase Commit o Commit de dos faces.</h2>
<p style="text-align: justify;">Para resolver el problema que acabamos de ver, es necesario utilizar transacciones distribuidas con un Commit de dos faces.</p>
<p style="text-align: justify;">El 2Phase Commit o Commit de dos faces se diferencia de un commit normal en que este engloba un una sola transacción los cambios realizados en dos o mas base de datos a la vez(XA Transaction). Para realizar esto, cada manejador de base de datos abrirá una transaccion de forma separada. El coordinador de la transacción les solicitara a todos los manejadores de base de datos que se preparen para el commit( Paso 1), en este punto cada base de datos esta lista para hacer el commit, Si todos los manejadores pasan por el paso 1 de forma positiva, entonces el coordinador de la transacción solicitara el commit a todos los manejadores. Al final, si todos las base de datos realizan el commit, entonces la transaccion sera exitoso y se habrá realizado una transaccion global.</p>
<p><figure id="attachment_390" aria-describedby="caption-attachment-390" style="width: 631px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommit.png"><img loading="lazy" class="wp-image-390 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommit.png" alt="2Phase commit" width="631" height="244" /></a><figcaption id="caption-attachment-390" class="wp-caption-text">Fig. 4: En la imagen podemos apreciar el commit de dos faces, el primer paso del lado izquierdo solicita a los manejadores de base de datos que se preparen para hacer el commit, el paso 2 del lado derecho, solicita a cada manejador que realice el commit.</figcaption></figure></p>
<p style="text-align: justify;">Otro escenario es cuando alguno de los manejadores falla durante la preparación al commit, por lo cual toda la transacción falla y todos los manejadores dan un Rollback a la transacción.</p>
<p><figure id="attachment_391" aria-describedby="caption-attachment-391" style="width: 632px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommitfail.png"><img loading="lazy" class="wp-image-391 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommitfail.png" alt="2Phase commit" width="632" height="239" /></a><figcaption id="caption-attachment-391" class="wp-caption-text">Fig. 5: Durante la preparación, una base de datos falla y se aplica un rollback en todas las bases de datos, lo cual provoca un rollback global.</figcaption></figure></p>
<h2>Escenario practico:</h2>
<p style="text-align: justify;">Para ilustrar esto de una forma mas practica, hablaremos de un ejemplo concreto donde se podria utilizar una transaccion distribuida o XA Transaction.</p>
<p style="text-align: justify;">Imaginemos que tenemos dos sistemas, el sistema de nomina y el contable, sin embargo requerimos realizar un servicio que nos permita crear un usuario, pero que este usuario sea valido para los dos sistemas, para lo cual el servicio tendrá que escribir en la base de datos de los dos sistemas para crearlos. Desde luego que es importante que si la creación falla en algunos de los dos, el usuario no deberá crearse en ninguno de los dos sistemas.</p>
<p><figure id="attachment_393" aria-describedby="caption-attachment-393" style="width: 597px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommitdistribuido.png"><img loading="lazy" class="wp-image-393 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/2phasecommitdistribuido.png" alt="2Phase commit" width="597" height="376" /></a><figcaption id="caption-attachment-393" class="wp-caption-text">Fig. 6:En la imagen podemos ver que el servicio habre una transacción global o XA Transacction y realiza los cambios en ambas bases de datos, luego solicita a los manejadores de base de datos que se preparen para el commit y finalmente se realiza un commit sobre las dos bases de datos.</figcaption></figure></p>
<p style="text-align: justify;">Acabamos de ver un ejemplo simple donde podemos utilizar un commit de dos faces, sin embargo pueden existir muchos mas escenarios donde sea necesario transaccionar dos o hasta mas base de datos a la vez.</p>
<h2>Conclusiones:</h2>
<p style="text-align: justify;">Las ventajas que ofrecen el 2Phase commit son muy grandes, ya que nos permite realizar transacciones globales con mas de una bases de datos a la vez, Ya solo dependerá de nosotros utilizarlas sabiamente, ya que en ambientes de integración siempre es mas recomendable utilizar servicios que conexiones directas a la bases de datos de nuestros aplicativos.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/09/19/data-base-2phase-commit-en-ambientes-distribuidos/">2Phase Commit</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/09/19/data-base-2phase-commit-en-ambientes-distribuidos/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">383</post-id>	</item>
	</channel>
</rss>
