<?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>hibernate &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/hibernate-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Thu, 25 Jun 2020 16:44:32 +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>hibernate &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Relaciónes @ManyToMany</title>
		<link>https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/27/relaciones-manytomany/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 27 Dec 2018 16:00:22 +0000</pubDate>
				<category><![CDATA[Base de datos]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[jpa]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2579</guid>

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



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



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



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



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



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



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

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

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

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



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



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



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



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



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

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

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

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<h2>Conclusiones</h2>



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



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

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



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



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



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



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



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



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

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

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

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



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



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



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

import javax.persistence.*;

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

}</code></pre>



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



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



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



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



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

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

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

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

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



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



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



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



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



<h2>Conclusiones</h2>



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



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



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

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



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



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



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



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



<h2>Definiendo un Path Param</h2>



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



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



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



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



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



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



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



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



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



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



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



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



<h2>Conclusiones</h2>



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

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


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



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/">Personalizar las relaciones con @JoinColumn</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/13/personalizar-las-relaciones-con-joincolumn/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2469</post-id>	</item>
		<item>
		<title>Store Procedure con parámetros de salida</title>
		<link>https://www.oscarblancarteblog.com/2014/09/03/hibernate-store-procedure-con-parametros-de-salida/</link>
					<comments>https://www.oscarblancarteblog.com/2014/09/03/hibernate-store-procedure-con-parametros-de-salida/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 03 Sep 2014 16:46:48 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<guid isPermaLink="false">http://oscarblancarteblog.com/2014/09/03/hibernate-store-procedure-con-parametros-de-salida/</guid>

					<description><![CDATA[<p>Es esta entrada les quiero compartir como invocar un Store Procedure con Parametros de Salida y recuperarlos por medio de Hibernate. Es ejemplo lo realizo con la Base de datos Oracle 11g XE y con la versión de Hibernate 4.3. Codigo del Store Procedure. &#160; A continuación el código con la explicación: package com.oscarblancarte.hibernate; import [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/09/03/hibernate-store-procedure-con-parametros-de-salida/">Store Procedure con parámetros de salida</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;"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/Hibernate-logo1-e1429932456458.png"><img loading="lazy" class=" wp-image-575 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/Hibernate-logo1-e1429932456458.png" alt="Hibernate-logo" width="100" height="100" /></a>Es esta entrada les quiero compartir como invocar un Store Procedure con Parametros de Salida y recuperarlos por medio de Hibernate.</p>
<p style="text-align: justify;">Es ejemplo lo realizo con la Base de datos Oracle 11g XE y con la versión de Hibernate 4.3.<span id="more-365"></span></p>
<h2><strong>Codigo del Store Procedure.</strong></h2>
<p><figure id="attachment_364" aria-describedby="caption-attachment-364" style="width: 490px" class="wp-caption aligncenter"><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/spscript.png"><img loading="lazy" class="wp-image-364 size-full" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/09/spscript.png" alt="Store Procedure" width="490" height="76" /></a><figcaption id="caption-attachment-364" class="wp-caption-text">Fig. 1: Codigo del SP</figcaption></figure></p>
<p>&nbsp;</p>
<h2><strong>A continuación el código con la explicación:</strong></h2>
<pre class="lang:java decode:true" title="HibernateProcedure.java">package com.oscarblancarte.hibernate;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.persistence.ParameterMode;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.procedure.ProcedureCall;
import org.hibernate.service.ServiceRegistry;

public class HibernateProcedure {

	private static final SessionFactory sessionFactory = buildSessionFactory();

	public static void main(String[] args) {
		// Obtenemos la session
		Session session = getSessionFactory().getCurrentSession();

		// Abrimos transacción &lt;OPCIONAL&gt;
		session.beginTransaction();

		// Nombre del SP
		ProcedureCall call = session.createStoredProcedureCall("PROC1");
		// Registramos el primer parametros de entrada
		call.registerParameter(1, String.class, ParameterMode.IN);
		// Registramos el segundo parametro de salida
		call.registerParameter(2, Integer.class, ParameterMode.OUT);

		//Establecemos el valor del primer parametros de entrada
		call.getParameterRegistration(1).bindValue("hola");
		//Ejecutamos el SP y obtenemos el parametro 2, el cual es de salida(out)
		Object salida = call.getOutputs().getOutputParameterValue(2);
		//Se imprime el parametro de salida
		System.out.println("SALIDA ==&gt; " + salida.toString());

		// cerramos transacción &lt;OPCIONAL&gt;
		session.getTransaction().commit();
		System.out.println("FIN");
	}

	private static SessionFactory buildSessionFactory() {
		try {
			Configuration configuration = new Configuration();
			configuration.configure("hibernate.cfg.xml");
			ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
					.applySettings(configuration.getProperties()).build();
			SessionFactory sessionFactory = configuration
					.buildSessionFactory(serviceRegistry);
			return sessionFactory;
		} catch (Throwable ex) {
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}</pre>
<p style="text-align: justify;">La clave es registrar adecuadamente los parámetros, registrando su tipo de dato y Mode el cual puede ser de entrada o salida.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/09/03/hibernate-store-procedure-con-parametros-de-salida/">Store Procedure con parámetros de salida</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/03/hibernate-store-procedure-con-parametros-de-salida/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">365</post-id>	</item>
		<item>
		<title>JPA, Hibernate VS JDBC</title>
		<link>https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 15 Jul 2014 22:00:39 +0000</pubDate>
				<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JDBC]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[ejb]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jdbc]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[objeto relacional]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[Programación orientada a objetos]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/2014/07/15/jpa-hibernate-vs-jdbc/</guid>

					<description><![CDATA[<p>Los que ya han tenido la oportunidad de trabajar con algún ORM como JPA o Hibernate sabrán las bondades que tiene ya que nos permite desarrollar de una forma mucho mas rápida y con muchos menos errores en tiempo de ejecución ya que nos permite modelar nuestras entidad como Clases Java las cuales serán convertidas [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/">JPA, Hibernate VS JDBC</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg"><img loading="lazy" class="size-full wp-image-603 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/JPAHibernate1-e1477360564109.jpg" alt="JPA HIBERNATE JDBC" width="150" height="83" /></a>Los que ya han tenido la oportunidad de trabajar con algún ORM como JPA o Hibernate sabrán las bondades que tiene ya que nos permite desarrollar de una forma mucho mas rápida y con muchos menos errores en tiempo de ejecución ya que nos permite modelar nuestras entidad como Clases Java las cuales serán convertidas a las instrucciones Insert, Update o Select según sea la operación a realizar. Claro que todas estos beneficios tiene un costo y es que el performance se degrada debido a todas las conversiones que se tiene que hacer para convertir las Entity en Querys y los ResultSet pasarlos a clases ademas que cada registro representa un Objeto en memoria que tendrá <span id="more-24"></span>que ser administrador por nuestra servidor.</p>
<p>Por otro lado tenemos a JDBC que nos brinda total libertad de hacer lo que queramos sin ningún tipo de limitación explotando al máximo las características de la base datos. JDBC nos permite realizar consultas nativas para cada base de datos lo que ayuda mucho a la velocidad de respuesta y los resultados son devueltos en un ResultSet los cuales podemos extraer solamente los datos que requerimos y no toda la Entity como en el caso de JPA o Hibernate.</p>
<p>&nbsp;</p>
<h2><strong>JPA,Hibernate</strong></h2>
<p>Ventajas</p>
<ol>
<li>Nos permite desarrollar mucho mas rápido.</li>
<li>Permite trabajar con la base de datos por medio de entidades en vez de Querys.</li>
<li>Nos ofrece un paradigma 100% orientado a objetos.</li>
<li>Elimina errores en tiempo de ejecución.</li>
<li>Mejora el mantenimiento del software.</li>
</ol>
<p>Desventajas</p>
<ol>
<li>No ofrece toda la funcionalidad que ofrecería tirar consultas nativas.</li>
<li>El performance es mucho mas bajo que realizar las consultas por JBDC.</li>
<li>Puede representar una curva de aprendizaje mas grande.</li>
</ol>
<p>&nbsp;</p>
<h2><strong>JDBC</strong></h2>
<p>Ventajas</p>
<ul>
<li>Ofrece un performance superior ya que es la forma mas directa de mandar instrucciones la base de datos.</li>
<li>Permite explotar al máximo las funcionalidades de la base de datos.</li>
</ul>
<p>Desventajas</p>
<ul>
<li>El mantenimiento es mucho mas costoso.</li>
<li>Introduce muchos errores en tiempo de ejecución.</li>
<li>El desarrollo es mucho mas lento.</li>
</ul>
<p>&nbsp;</p>
<p>Probablemente pensaras que JPA o Hibernate son mejores ya que ofrece mayor ventajas que desventajas sin embargo las desventajas que tiene son muy serias y pueden ser cruciales a la hora de decidir que tecnología utilizar ya que si tenemos una aplicación muy buena y fácil de mantener pero que tarda demasiado para consultar datos puede llegar a ser algo muy malo.</p>
<p>Como conclusión yo diría que si requieres una aplicación donde el rendimiento sea el factor mas importante utilices JDBC, pero por otra parte si el rendimiento es algo que no están importante puedes utilizar JPA o Hibernate.</p>
<h2></h2>
<h2>Tutorial de JPA Gratis!!</h2>
<p>Si estás leyendo esto en este momento es por seguramente estas interesado en aprender Hibernate o JPA, pues te tengo buenas noticias, ya que he iniciado un tutorial muy completo de JPA para que aprendas desde cero y sin conocimientos previos como utilizar JPA. No te sientas mal si lo que tu buscas es aprender Hibernate, ya que actualmente existe una implementación de JPA desarrollada por Hibernate. Además, JPA es el ORM Estándar de Java y que se integra a la perfección con el resto de especificaciones de Java, como lo es EJB 3.X, CDI, Bean Validator, entre otras más. Pues bien, si estas interesado en tomar este tutorial puedes <a href="http://www.oscarblancarteblog.com/tutoriales/java-persistence-api-jpa/">entrar aquí</a>.</p>
<p>&nbsp;		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2014/07/15/jpa-hibernate-vs-jdbc/">JPA, Hibernate VS JDBC</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/07/15/jpa-hibernate-vs-jdbc/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">24</post-id>	</item>
	</channel>
</rss>
