<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edgar Rios Navarro</title>
    <description>The latest articles on DEV Community by Edgar Rios Navarro (@e240683).</description>
    <link>https://dev.to/e240683</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F596767%2F91be3231-c59c-4d17-9459-19ac0a94e333.jpg</url>
      <title>DEV Community: Edgar Rios Navarro</title>
      <link>https://dev.to/e240683</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/e240683"/>
    <language>en</language>
    <item>
      <title>Optimizando el Testing de APIs con Karate</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Sat, 08 Aug 2026 23:29:30 +0000</pubDate>
      <link>https://dev.to/e240683/optimizando-el-testing-de-apis-con-karate-44gk</link>
      <guid>https://dev.to/e240683/optimizando-el-testing-de-apis-con-karate-44gk</guid>
      <description>&lt;p&gt;En el ecosistema actual de microservicios, la validación manual de endpoints mediante herramientas como &lt;code&gt;curl&lt;/code&gt; o Postman representa un cuello de botella que compromete la agilidad y la fiabilidad. Ante este desafío, surge la necesidad de implementar soluciones de testing automatizado que sean, a la vez, robustas y accesibles. Un ejemplo reciente de esta transición se encuentra en la implementación de una arquitectura basada en &lt;strong&gt;Quarkus y Redis&lt;/strong&gt;, donde se ha integrado &lt;strong&gt;Karate DSL&lt;/strong&gt; para elevar la estrategia de pruebas de integración.&lt;/p&gt;

&lt;h4&gt;
  
  
  El valor diferencial de Karate DSL
&lt;/h4&gt;

&lt;p&gt;Karate DSL se posiciona como una herramienta disruptiva en el testing de APIs al utilizar el formato &lt;strong&gt;Gherkin (BDD)&lt;/strong&gt;. Su principal ventaja técnica reside en la capacidad de ejecutar peticiones HTTP directamente desde archivos &lt;code&gt;.feature&lt;/code&gt;, eliminando la necesidad de escribir código Java boilerplate. Esto no solo simplifica el mantenimiento, sino que transforma las pruebas en documentación viva, inteligible para perfiles técnicos y funcionales por igual.&lt;/p&gt;

&lt;h4&gt;
  
  
  Ejemplo práctico: Validación de persistencia en Redis
&lt;/h4&gt;

&lt;p&gt;En el proyecto de referencia —un servicio que gestiona contadores persistidos en Redis—, la implementación de Karate permitió definir escenarios de prueba altamente legibles. A continuación, se muestra cómo se estructuró la validación de un flujo básico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gherkin"&gt;&lt;code&gt;&lt;span class="kd"&gt;Feature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Gestión de contadores en Redis

  &lt;span class="kn"&gt;Scenario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; Crear y recuperar un contador
    &lt;span class="err"&gt;Given url 'http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;//localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;8080/increments'&lt;/span&gt;
    &lt;span class="err"&gt;And request { key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'visitas', value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;10&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;When &lt;/span&gt;method POST
    &lt;span class="nf"&gt;Then &lt;/span&gt;status 201

    &lt;span class="nf"&gt;Given &lt;/span&gt;path 'visitas'
    &lt;span class="nf"&gt;When &lt;/span&gt;method GET
    &lt;span class="nf"&gt;Then &lt;/span&gt;status 200
    &lt;span class="err"&gt;And match response == { key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;'visitas', value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;10&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Aspectos destacados de esta implementación:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Aserciones declarativas:&lt;/strong&gt; La potencia de la sintaxis &lt;code&gt;match&lt;/code&gt; permite validar tipos de datos y estructuras de JSON con una precisión que supera a los enfoques tradicionales, sin añadir complejidad lógica al test.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Ciclo de vida integrado:&lt;/strong&gt; La ejecución se integra de forma nativa en el build de &lt;strong&gt;Gradle&lt;/strong&gt;, garantizando que cada modificación del código sea validada automáticamente en cada ciclo de integración.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Escalabilidad:&lt;/strong&gt; Al separar la lógica de negocio de la lógica de prueba, el repositorio se mantiene limpio y las pruebas actúan como una especificación ejecutable del contrato de la API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Conclusión
&lt;/h4&gt;

&lt;p&gt;La adopción de Karate DSL en entornos Java modernos, como Quarkus, demuestra ser una estrategia efectiva para equipos que buscan elevar sus estándares de calidad. Al reducir la carga cognitiva del testing y fomentar un enfoque BDD, se logra un balance óptimo entre velocidad de desarrollo y fiabilidad del sistema.&lt;/p&gt;

&lt;p&gt;Para aquellos interesados en profundizar en esta configuración, el código fuente completo y la estructura de pruebas están disponibles en el siguiente repositorio: &lt;a href="https://github.com/edgargs/example-quarkus-redis-karate" rel="noopener noreferrer"&gt;https://github.com/edgargs/example-quarkus-redis-karate&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>java</category>
      <category>quarkus</category>
      <category>karatedsl</category>
      <category>bdd</category>
    </item>
    <item>
      <title>Jira Java API</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Wed, 13 Aug 2025 15:22:22 +0000</pubDate>
      <link>https://dev.to/e240683/jira-java-api-3l6k</link>
      <guid>https://dev.to/e240683/jira-java-api-3l6k</guid>
      <description>&lt;p&gt;Jira provee un REST API, del que se abordó en el post anterior: &lt;a href="https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n"&gt;https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n&lt;/a&gt;. Pero también, provee un &lt;strong&gt;Java API&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para este caso, importar dos librerías específicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;jira-rest-java-client-core&lt;/li&gt;
&lt;li&gt;fugue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Luego, implementar la autenticación (mediante &lt;em&gt;cookie&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Finalmente, invocar la búsqueda del &lt;em&gt;Issue&lt;/em&gt; y acceder a sus propiedades.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developer.atlassian.com/server/jira/platform/java-apis/" rel="noopener noreferrer"&gt;https://developer.atlassian.com/server/jira/platform/java-apis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jira</category>
      <category>java</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cliente Jira mediante Cookie</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Thu, 06 Mar 2025 17:08:27 +0000</pubDate>
      <link>https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n</link>
      <guid>https://dev.to/e240683/cliente-jira-mediante-cookie-5f3n</guid>
      <description>&lt;p&gt;Aunque acceder a Jira mediante Cookie es una funcionalidad deprecada, sigue siendo una alternativa en entornos restrictivos al uso del Token.&lt;/p&gt;

&lt;p&gt;En Typescript existe una librería recomendada por su reducido tamaño:&lt;br&gt;
&lt;a href="https://github.com/UrielCh/jira-api/" rel="noopener noreferrer"&gt;https://github.com/UrielCh/jira-api/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El fork que utiliza la opción de Cookie lo subí al siguiente repositorio: &lt;a href="https://github.com/edgargs/jira-api/tree/feature/client-cookie" rel="noopener noreferrer"&gt;https://github.com/edgargs/jira-api/tree/feature/client-cookie&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este bloque de código, demuestra el cambio en la creación del cliente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JRA_DOMAIN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Deno&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;JRA_COOKIE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;jira&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JiraClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;COOKIE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cookie&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El valor del cookie se obtiene de la sesión activa en el navegador web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusi0h4riraaf8rm6g7b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusi0h4riraaf8rm6g7b8.png" alt="Image description" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>jira</category>
      <category>programming</category>
    </item>
    <item>
      <title>Procesar miles de registros con Spring-Batch</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Tue, 26 Sep 2023 22:51:33 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-miles-de-registros-con-spring-batch-81h</link>
      <guid>https://dev.to/e240683/procesar-miles-de-registros-con-spring-batch-81h</guid>
      <description>&lt;p&gt;Pongamos como contexto, que se necesita &lt;strong&gt;leer&lt;/strong&gt; desde una base de datos origen y &lt;strong&gt;grabar&lt;/strong&gt; en otra base de datos distinta. Con el propósito de realizar resúmenes y cuadres diarios.&lt;/p&gt;




&lt;p&gt;Lo más eficiente será no depender de algún ORM. Por lo que se recomienda emplear JDBC.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Spring-Batch&lt;/em&gt; provee un &lt;em&gt;JdbcPagingItemReader&lt;/em&gt; el cual, al recuperar los registros de manera paginada no ocupará memoria en retener todo el resultado de la consulta. &lt;/p&gt;

&lt;p&gt;También tenemos un &lt;em&gt;JdbcBatchItemWriter&lt;/em&gt; para grabar los registros, que los grabarán usando la capacidad &lt;strong&gt;batch&lt;/strong&gt; del &lt;em&gt;driver&lt;/em&gt;.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database"&gt;https://docs.spring.io/spring-batch/docs/current/reference/html/readersAndWriters.html#database&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability"&gt;https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html#scalability&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>mysql</category>
      <category>oracle</category>
      <category>spring</category>
    </item>
    <item>
      <title>MySQL usar tipo SET para validar</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Tue, 04 Jul 2023 15:00:57 +0000</pubDate>
      <link>https://dev.to/e240683/mysql-usar-tipo-set-para-validar-p28</link>
      <guid>https://dev.to/e240683/mysql-usar-tipo-set-para-validar-p28</guid>
      <description>&lt;p&gt;Cuando diseñamos un sistema y tenemos una lista restringida de opciones, el modelo ER nos mostrará una relación de 'muchos a muchos'.&lt;/p&gt;

&lt;p&gt;Consideremos el caso de Usuario - Roles:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bvU-behQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrm144ee62bmn1iyts6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bvU-behQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rrm144ee62bmn1iyts6e.png" alt="Image description" width="741" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El diagrama nos indica que debemos crear tres tablas.&lt;/p&gt;




&lt;p&gt;Como alternativa, en MySQL nos proporciona el tipo &lt;em&gt;SET&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h2b0YvUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le2bs6i3qwr5jwskifxt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h2b0YvUo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/le2bs6i3qwr5jwskifxt.png" alt="Image description" width="634" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dicho campo acepta ninguno, uno o más valores de la lista.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; insert into user(email,name,password) 
values('a@greatsolutions.consulting','A','A');
Query OK, 1 row affected (0.04 sec)

mysql&amp;gt; insert into user(email,name,password,roles) 
values('b@greatsolutions.consulting','B','B','');
Query OK, 1 row affected (0.04 sec)

mysql&amp;gt; insert into user(email,name,password,roles) 
values('c@greatsolutions.consulting','C','C','editor,user');
Query OK, 1 row affected (0.04 sec)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por el contrario, nos da error cuando intentamos insertar un valor diferente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; insert into user(email,name,password,roles) 
values('d@greatsolutions.consulting','D','D','root');
ERROR 1265 (01000): Data truncated for column 'roles' at row 1
mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/8.0/en/set.html"&gt;https://dev.mysql.com/doc/refman/8.0/en/set.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Autoincrement en Oracle</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Wed, 21 Jun 2023 16:41:48 +0000</pubDate>
      <link>https://dev.to/e240683/autoincrement-en-oracle-20ja</link>
      <guid>https://dev.to/e240683/autoincrement-en-oracle-20ja</guid>
      <description>&lt;p&gt;Consideremos el &lt;em&gt;script&lt;/em&gt; original, basado en la versión 11g:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="c1"&gt;-- 11g --&lt;/span&gt;
&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt; 
&lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;CONSTRAINT&lt;/span&gt; &lt;span class="n"&gt;PK_ID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;SEQUENCE&lt;/span&gt; &lt;span class="n"&gt;SEQ_ORDERS&lt;/span&gt;
 &lt;span class="k"&gt;START&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt;     &lt;span class="mi"&gt;1000&lt;/span&gt;
 &lt;span class="k"&gt;INCREMENT&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;
 &lt;span class="n"&gt;NOCACHE&lt;/span&gt;
 &lt;span class="n"&gt;NOCYCLE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;TRG_I_ORDERS&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;
   &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;
   &lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SEQ_ORDERS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NEXTVAL&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anteriormente, se empleaba un &lt;em&gt;trigger&lt;/em&gt; para incrementar el &lt;strong&gt;ID&lt;/strong&gt;: recuperar el valor de un &lt;em&gt;sequence&lt;/em&gt; y asignarlo al campo. &lt;/p&gt;




&lt;p&gt;Desde la versión 12c, obtenemos la misma funcionalidad con &lt;strong&gt;IDENTITY Column&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;---------&lt;/span&gt;
&lt;span class="c1"&gt;-- 12c --&lt;/span&gt;
&lt;span class="c1"&gt;---------&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;ORDERS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;GENERATED&lt;/span&gt; &lt;span class="n"&gt;ALWAYS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/CREATE-TABLE.html#GUID-F9CE0CC3-13AE-4744-A43C-EAC7A71AAAB6__CJAECCFH"&gt;Oracle:Database:identity_clause&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>database</category>
      <category>backend</category>
    </item>
    <item>
      <title>Procesar una transacción completamente con TRANSACT-SQL</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 28 Apr 2023 14:06:29 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-una-transaccion-remota-xml-con-transact-sql-de5</link>
      <guid>https://dev.to/e240683/procesar-una-transaccion-remota-xml-con-transact-sql-de5</guid>
      <description>&lt;p&gt;Consideremos que, la cadena XML se genera en el servidor de aplicación. Se emplea la configuración de Spring para usar JAXB2. &lt;/p&gt;

&lt;p&gt;Debemos asignar una lista de detalle (listCollectionSpendReport) a la entidad que vamos a persistir (collection). Nótese que, previamente se grababa la entidad y luego, uno por uno, los detalles.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;El procedimiento almacenado, recibe los datos de la entidad principal y una cadena de los detalles. Luego, son casteados en formato &lt;em&gt;XML&lt;/em&gt; y recorridos en una sentencia &lt;strong&gt;SELECT&lt;/strong&gt; para ser insertados en la tabla correspondiente.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://docs.spring.io/spring-ws/site/reference/html/oxm.html"&gt;http://docs.spring.io/spring-ws/site/reference/html/oxm.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sqlserver</category>
      <category>transactsql</category>
      <category>java</category>
      <category>backend</category>
    </item>
    <item>
      <title>Enviar geoposición desde el backend con Primefaces y Gmaps.</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 14 Apr 2023 13:48:57 +0000</pubDate>
      <link>https://dev.to/e240683/enviar-geoposicion-desde-el-backend-con-primefaces-y-gmaps-og9</link>
      <guid>https://dev.to/e240683/enviar-geoposicion-desde-el-backend-con-primefaces-y-gmaps-og9</guid>
      <description>&lt;p&gt;Este ejemplo muestra como interactuar con información del backend y el frontend. Específicamente, enviar una posición y mostrarla en un mapa (google maps).&lt;/p&gt;

&lt;p&gt;Recuperamos la latitud y longitud (posiblemente desde la base de datos) en el controller.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;La posición lo almacenamos en variables de javascript. En la página web, también tendremos dos input's para mostrar cómo va cambiando la posición al mover el marker.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;Creamos el mapa y colocamos el marker. Agregamos los eventos para mostrar la posición actual.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://developers.google.com/maps/documentation/javascript/examples/"&gt;https://developers.google.com/maps/documentation/javascript/examples/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>jsf</category>
      <category>gmaps</category>
    </item>
    <item>
      <title>Procesar una transacción remota (XML) mediante un procedimiento almacenado</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Fri, 10 Mar 2023 15:50:29 +0000</pubDate>
      <link>https://dev.to/e240683/procesar-una-transaccion-remota-xml-mediante-un-procedimiento-almacenado-5d39</link>
      <guid>https://dev.to/e240683/procesar-una-transaccion-remota-xml-mediante-un-procedimiento-almacenado-5d39</guid>
      <description>&lt;p&gt;Para enviar información (transaccional) hacia una base de datos centralizada, prodríamos emplear un servicio web: recibe los datos y los persiste de forma autónoma, segura y confiable. Pero como alternativa, es invocar un procedimiento almacenado remoto. &lt;/p&gt;

&lt;p&gt;Consideremos la limitante que no podemos enviar la información en formato JSON. La versión del motor no lo soporta: Oracle 11g. La solución será emplear el formato XML. &lt;/p&gt;

&lt;p&gt;No pasemos por alto los riesgos de enviar la información no cifrada (el sistema está en una red privada o no), el tamaño de los datos y el costo de procesamiento del servidor.&lt;/p&gt;




&lt;p&gt;Este ejemplo nuestra cómo generar el formato XML en el cliente. Se etiqueta los bean's con la anotación  @XmlRootElement. &lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;El procedimiento para interpretar el xml y grabar las tablas correspondientes. La solución es válida para todas las base de datos relacionales (como Postgres y Sql Server), aunque el código varía entre ellas.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;





&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/edgargs/Ejemplo-2016-01.git"&gt;https://github.com/edgargs/Ejemplo-2016-01.git&lt;/a&gt;&lt;br&gt;
&lt;a href="http://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/"&gt;http://howtodoinjava.com/jaxb/jaxb-exmaple-marshalling-and-unmarshalling-list-or-set-of-objects/&lt;/a&gt; &lt;br&gt;
&lt;a href="http://viralpatel.net/blogs/oracle-xmltable-tutorial/"&gt;http://viralpatel.net/blogs/oracle-xmltable-tutorial/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xml</category>
      <category>oracle</category>
      <category>java</category>
      <category>backend</category>
    </item>
    <item>
      <title>JTable Color Header</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Sat, 28 Jan 2023 16:12:39 +0000</pubDate>
      <link>https://dev.to/e240683/jtable-color-header-e0k</link>
      <guid>https://dev.to/e240683/jtable-color-header-e0k</guid>
      <description>&lt;p&gt;A diferencia de las aplicaciones web, personalizar grillas (tablas) en Java Swing requiere de mucho más código. Pero podemos ayudarnos con clases utilitarias.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Original
&lt;/h2&gt;

&lt;p&gt;Consideremos este ejemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h450iqjxk20ikm51gut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8h450iqjxk20ikm51gut.png" alt="Image description" width="719" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Column Group
&lt;/h2&gt;

&lt;p&gt;Para agregar la capacidad de agrupar columnas, emplearemos una clase llamada &lt;em&gt;ColumnGroup&lt;/em&gt;. Reconoce el título y las columnas que debe agrupar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ColumnGroup&lt;/span&gt; &lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ColumnGroup&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Precio Venta "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"S/."&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;UtilityTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;initSelectList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jTable&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tableModel&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;ConstantsVentas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columnsList&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; 
&lt;span class="n"&gt;columnGroup&lt;/span&gt; &lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fuvftvufhujihqh9drw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6fuvftvufhujihqh9drw.png" alt="Image description" width="719" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Color Header
&lt;/h2&gt;

&lt;p&gt;También podemos cambiar el color de columnas específicas. Ello lo conseguimos indicando en la clase &lt;em&gt;FarmaColumnData&lt;/em&gt;, el color de fondo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgqg2tg44uj5yhmqwiyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgqg2tg44uj5yhmqwiyu.png" alt="Image description" width="695" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9i50ayv1zrmhcuwh42s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9i50ayv1zrmhcuwh42s.png" alt="Image description" width="723" height="297"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/tutorial/uiswing/components/table.html" rel="noopener noreferrer"&gt;https://docs.oracle.com/javase/tutorial/uiswing/components/table.html&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/edgargs/table-color-header.git" rel="noopener noreferrer"&gt;https://github.com/edgargs/table-color-header.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>frontend</category>
      <category>html</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Mock Service with Groovy</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Thu, 08 Dec 2022 12:30:18 +0000</pubDate>
      <link>https://dev.to/e240683/mock-service-with-groovy-a4a</link>
      <guid>https://dev.to/e240683/mock-service-with-groovy-a4a</guid>
      <description>&lt;p&gt;Cuando dependemos de una servicio de tercero, nos encontraremos con la situación que dicho servicio no está disponible por un tiempo. Para eliminar esa dependencia, podemos crear un &lt;em&gt;MockService&lt;/em&gt; por nuestra cuenta.&lt;/p&gt;

&lt;p&gt;En el ecosistema de &lt;strong&gt;Groovy&lt;/strong&gt;, existe una librería que nos facilita: RatPack.&lt;/p&gt;




&lt;p&gt;En una solo archivo, configuramos los métodos y las respuestas. Es posible agregarle lógica, pero la intención es que tengamos respuesta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"io.ratpack:ratpack-groovy:1.3.3"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;ratpack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ratpack&lt;/span&gt;
&lt;span class="n"&gt;ratpack&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;handlers&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Transaccion.asmx/getAffiliationSearch"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;byMethod&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contentType&lt;/span&gt; &lt;span class="s2"&gt;"text/xml"&lt;/span&gt;
          &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt; &lt;span class="s1"&gt;'''&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;
            &amp;lt;ArrayOfStAffiliationSearch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://mifarmaws02.orbisfarma.com.mx/"&amp;gt;
                &amp;lt;stAffiliationSearch&amp;gt;
                    &amp;lt;transactionid&amp;gt;183477976581&amp;lt;/transactionid&amp;gt;
                    &amp;lt;cardnumber&amp;gt;D007330811&amp;lt;/cardnumber&amp;gt;
                    &amp;lt;accountnumber&amp;gt;D007330811&amp;lt;/accountnumber&amp;gt;
                    &amp;lt;cardname&amp;gt;VILMA ALEJANDRINA&amp;lt;/cardname&amp;gt;
                    &amp;lt;cardlastname&amp;gt;FERNANDEZ@RUIZ&amp;lt;/cardlastname&amp;gt;
                    &amp;lt;cardbirthdate&amp;gt;19641008&amp;lt;/cardbirthdate&amp;gt;
                    &amp;lt;cardgender&amp;gt;F&amp;lt;/cardgender&amp;gt;
                    &amp;lt;carddoctor /&amp;gt;
                    &amp;lt;cardcontactpreferences&amp;gt;1&amp;lt;/cardcontactpreferences&amp;gt;
                    &amp;lt;cardemail /&amp;gt;
                    &amp;lt;cardphone /&amp;gt;
                    &amp;lt;cardcellphone /&amp;gt;
                    &amp;lt;cardaddress&amp;gt;| | | | | |&amp;lt;/cardaddress&amp;gt;
                    &amp;lt;cardrelated&amp;gt;8601080650271&amp;lt;/cardrelated&amp;gt;
                    &amp;lt;cardfields&amp;gt;0&amp;lt;/cardfields&amp;gt;
                    &amp;lt;errorid&amp;gt;0&amp;lt;/errorid&amp;gt;
                    &amp;lt;message /&amp;gt;
                    &amp;lt;transactiondate&amp;gt;2022-11-24 18:00:00&amp;lt;/transactiondate&amp;gt;
                &amp;lt;/stAffiliationSearch&amp;gt;
            &amp;lt;/ArrayOfStAffiliationSearch&amp;gt;'''&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;mock-service.groovy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al consultar:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa5u08nndp3kkql2szaw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faa5u08nndp3kkql2szaw.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://ratpack.io/" rel="noopener noreferrer"&gt;https://ratpack.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>groovy</category>
      <category>mock</category>
      <category>testing</category>
    </item>
    <item>
      <title>Mapping with SCHEMA</title>
      <dc:creator>Edgar Rios Navarro</dc:creator>
      <pubDate>Sat, 15 Oct 2022 23:58:43 +0000</pubDate>
      <link>https://dev.to/e240683/mapping-with-schema-502e</link>
      <guid>https://dev.to/e240683/mapping-with-schema-502e</guid>
      <description>&lt;p&gt;Una mala práctica en la configuración de aplicaciones, es usar el &lt;em&gt;owner&lt;/em&gt; del esquema para acceder a la base de datos.&lt;br&gt;
Es recomendable crear una cuenta de usuario y otorgar los permisos necesarios y específicos.&lt;/p&gt;

&lt;p&gt;Pongamos como ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ESQUEMA&lt;/strong&gt;: REGIONALIZACION&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USUARIO&lt;/strong&gt;: MSPRODUCTOSWOW&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PERMISOS&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Oracle&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; 
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;REGIONALIZACION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LGT_PROD_LOCAL_OFERTA_AUX&lt;/span&gt; 
&lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;MSPRODUCTOSWOW&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Empleando las anotaciones de Jakarta Persistence, definimos el mapping de nuestra Entity: name/schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"LGT_PROD_LOCAL_OFERTA_AUX"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"REGIONALIZACION"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;WOWProduct&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@EmbeddedId&lt;/span&gt; &lt;span class="nc"&gt;WOWProductId&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;porcDctoOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecIniVigOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecFinVigOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;usuCreaProdLocOfe&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                         &lt;span class="nc"&gt;LocalDateTime&lt;/span&gt; &lt;span class="n"&gt;fecCreaProdLocOfe&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nótese que podemos usar &lt;em&gt;record&lt;/em&gt;, incluso para definir una llave compuesta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Embeddable&lt;/span&gt;
&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;WOWProductId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_GRUPO_CIA"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codGrupoCia&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_LOCAL"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codLocal&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_OFERTA"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codOferta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nd"&gt;@Column&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"COD_PROD"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;codProd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutamos nuestro proyecto basado en #Micronaut:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NWbBl62r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dduj691vh960zfb1et5x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWbBl62r--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dduj691vh960zfb1et5x.png" alt="Image description" width="880" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y al listar los productos:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I3w81hR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeby3jyiva7vakg9v8em.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I3w81hR---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xeby3jyiva7vakg9v8em.png" alt="Image description" width="452" height="464"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentación
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://micronaut-projects.github.io/micronaut-data/latest/guide/#sqlAnnotations"&gt;https://micronaut-projects.github.io/micronaut-data/latest/guide/#sqlAnnotations&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/edgargs/mn-jdbc-schema"&gt;https://github.com/edgargs/mn-jdbc-schema&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oracle</category>
      <category>micronaut</category>
      <category>jdbc</category>
    </item>
  </channel>
</rss>
