<?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>Forem: Marcus Paulo</title>
    <description>The latest articles on Forem by Marcus Paulo (@marcuspaulo).</description>
    <link>https://forem.com/marcuspaulo</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F301970%2Fe49a1094-7ecb-467c-9fa1-7b71a52fcd1d.jpeg</url>
      <title>Forem: Marcus Paulo</title>
      <link>https://forem.com/marcuspaulo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marcuspaulo"/>
    <language>en</language>
    <item>
      <title>Tutorial: Publish a Quarkus application in Kubernetes, Minikube and Dockerhub</title>
      <dc:creator>Marcus Paulo</dc:creator>
      <pubDate>Sat, 10 Apr 2021 00:51:26 +0000</pubDate>
      <link>https://forem.com/marcuspaulo/tutorial-publish-a-quarkus-application-in-kubernetes-minikube-and-dockerhub-36nd</link>
      <guid>https://forem.com/marcuspaulo/tutorial-publish-a-quarkus-application-in-kubernetes-minikube-and-dockerhub-36nd</guid>
      <description>&lt;h3&gt;
  
  
  Notes
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;This is my first English post, then please give me your feedback, and suggestion to correct any mistakes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Introduction
&lt;/h3&gt;

&lt;p&gt;The article purpose to create a simple application in Quakus and publish in Minikube (Kubernetes for the local test) and finally publish the image Docker to in &lt;a href="https://hub.docker.com/" rel="noopener noreferrer"&gt;Dockerhub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For more information on these technologies: Kubernetes (K8S), Docker, Minikube, Kubectl e do Quarkus, please visit these sites:&lt;/p&gt;

&lt;p&gt;Docker: &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;https://www.docker.com/&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Minikube: &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minikube (Kubernetes): &lt;a href="https://kubernetes.io/pt/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/" rel="noopener noreferrer"&gt;https://kubernetes.io/pt/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/&lt;/a&gt;&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Minikube is local Kubernetes&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;, focusing on making it easy to learn and develop for Kubernetes. It is not recommending to&lt;/em&gt; &lt;strong&gt;&lt;em&gt;production&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;environment.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Install Docker: &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;https://docs.docker.com/engine/install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Install Kubernetes: &lt;a href="https://kubernetes.io/pt/docs/setup/" rel="noopener noreferrer"&gt;https://kubernetes.io/pt/docs/setup/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Install Kubeclt: &lt;a href="https://kubernetes.io/docs/tasks/tools/" rel="noopener noreferrer"&gt;https://kubernetes.io/docs/tasks/tools/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Install Minikube: &lt;a href="https://minikube.sigs.k8s.io/docs/start/" rel="noopener noreferrer"&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Install Open JDK 11+: &lt;a href="https://openjdk.java.net/install/" rel="noopener noreferrer"&gt;https://openjdk.java.net/install/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s go! We will create a new simple Quarkus application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a simple Quarkus application by command line
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn io.quarkus:quarkus-maven-plugin:1.13.0.Final:create \\\\    -DprojectGroupId=br.com.mp \\\\    -DprojectArtifactId=kubernetes-quarkus \\\\    -DclassName="br.com.mp.kubernetes.quarkus.rest.GreetingResource" \\\\    -Dpath="/hello" \\\\    -Dextensions="resteasy,kubernetes,jib"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access the project folder
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd kubernetes-quarkus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  In the next step, let’s go to test the project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn quarkus:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Result in terminal (console)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A1YJUq5GO23ngM3RHTQanpQ.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A1YJUq5GO23ngM3RHTQanpQ.png" alt="Running Quarkus application by command line"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Running Quarkus application by command line&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn quarkus:add-extension -Dextensions="quarkus-minikube"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can insert in pom.xml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;  &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;  &amp;lt;artifactId&amp;gt;quarkus-minikube&amp;lt;/artifactId&amp;gt;&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It is possible to create Quarkus application by command line, adding Minikube extensions.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creating a local Container Registry in Minikube
&lt;/h3&gt;

&lt;p&gt;It is necessary to set the environment variable with “eval” command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval $(minikube -p minikube docker-env)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create Docker image with Quarkus by command line
&lt;/h3&gt;

&lt;p&gt;Next step, create a maven package with Quarkus parameter to build a container image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn package -Dquarkus.container-image.build=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Kubernetes and Minikube manifest create
&lt;/h3&gt;

&lt;p&gt;After execute the last command, maven and Quarkus will create the manifest files, located in the folder “&lt;strong&gt;/target/kubernetes”&lt;/strong&gt;, as you see in the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A4sKtcmd1jXa3qd4Kf1B5aw.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A4sKtcmd1jXa3qd4Kf1B5aw.png" alt="https://cdn-images-1.medium.com/max/1600/1*4sKtcmd1jXa3qd4Kf1B5aw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  List of all docker images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//List all docker imagesdocker image ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[output]REPOSITORY                        TAG              IMAGE ID       CREATED         SIZEmarcus/kubernetes-quarkus-teste   1.0.0-SNAPSHOT   e574987218c4   3 minutes ago   199MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  In the next step, we need to apply Minikube manifest to publish in Minikube Kubernetes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f target/kubernetes/minikube.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[output]service/kubernetes-quarkus-teste createddeployment.apps/kubernetes-quarkus-teste created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a few seconds or minutes, the application is available on Minikube,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Pods are the smallest, most basic deployable objects in Kubernetes (&lt;/em&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/pod" rel="noopener noreferrer"&gt;&lt;em&gt;https://cloud.google.com/kubernetes-engine/docs/concepts/pod&lt;/em&gt;&lt;/a&gt;&lt;em&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  List of all pods
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get po
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[output]NAME                                        READY   STATUS    RESTARTS   AGEkubernetes-quarkus-teste-54db4f8df8-gf7nf   1/1     Running   0          6m52s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access the application at the local machine
&lt;/h3&gt;

&lt;p&gt;To access on the local machine, it is required to redirect Minikube address to localhost, type this command. (Each Pod there is a unique name)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl port-forward pod/kubernetes-quarkus-teste-54db4f8df8-gf7nf 8080:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[output]Forwarding from 127.0.0.1:8080 -&amp;gt; 8080Forwarding from [::1]:8080 -&amp;gt; 8080Handling connection for 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access application in browser
&lt;/h3&gt;

&lt;p&gt;Open your browser and insert this address:&lt;code&gt;[http://localhost:8080](http://localhost:8080)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A7Stxh1OQC1cC2YdXiDMIoQ.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A7Stxh1OQC1cC2YdXiDMIoQ.png" alt="https://cdn-images-1.medium.com/max/1600/1*7Stxh1OQC1cC2YdXiDMIoQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Publish the image to Dockerhub
&lt;/h3&gt;

&lt;p&gt;From now, we are sending our docker image to Dockerhub, with maven command and Quarkus parameter (container image).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean package -Dquarkus.container-image.push=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  In my case, it happened this error
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Caused by: com.google.cloud.tools.jib.api.RegistryUnauthorizedException:Unauthorized for registry-1.docker.io/marcus/kubernetes-quarkus-teste[ERROR]         at com.google.cloud.tools.jib.registry.RegistryEndpointCaller.call(RegistryEndpointCaller.java:164)[ERROR]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For fix this problem, please follow these steps:&lt;/p&gt;

&lt;p&gt;1 — Type this command to login on Dockerhub services&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 — The local Docker image was created with username machine, in my case is &lt;strong&gt;marcus/kubernetes-quarkus&lt;/strong&gt;, but the correct Dockerhub username is &lt;strong&gt;marcuspaulo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inside the Quarkus project, search &lt;a href="http://application.properties" rel="noopener noreferrer"&gt;application.properties&lt;/a&gt; file and insert the line above (with your Dockerhub username)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarkus.container-image.group=marcuspaulo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Publish in the Dockerhub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean package -Dquarkus.container-image.push=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, open your browser and access this address: &lt;a href="https://hub.docker.com/repositories" rel="noopener noreferrer"&gt;https://hub.docker.com/repositories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2Ar4zFo7nwejzDw4fPWw9_bg.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2Ar4zFo7nwejzDw4fPWw9_bg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope that you enjoy this tutorial. Thanks for your attention. Please like and share this post. See you soon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/marcuspaulo/kubernetes-quarkus" rel="noopener noreferrer"&gt;https://github.com/marcuspaulo/kubernetes-quarkus&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/container-image#quarkus-container-image_quarkus.container-image.registry" rel="noopener noreferrer"&gt;https://quarkus.io/guides/container-image#quarkus-container-image_quarkus.container-image.registry&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/deploying-to-kubernetes" rel="noopener noreferrer"&gt;https://quarkus.io/guides/deploying-to-kubernetes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/kubernetes-client" rel="noopener noreferrer"&gt;https://quarkus.io/guides/kubernetes-client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://minikube.sigs.k8s.io/docs/handbook/registry/" rel="noopener noreferrer"&gt;https://minikube.sigs.k8s.io/docs/handbook/registry/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://haralduebele.blog/2020/04/03/deploy-your-quarkus-applications-on-kubernetes-almost-automatically/" rel="noopener noreferrer"&gt;https://haralduebele.blog/2020/04/03/deploy-your-quarkus-applications-on-kubernetes-almost-automatically/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/pod" rel="noopener noreferrer"&gt;https://cloud.google.com/kubernetes-engine/docs/concepts/pod&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>quarkus</category>
      <category>docker</category>
      <category>minikube</category>
    </item>
    <item>
      <title>Tutorial: Disponibilizando uma aplicação Quarkus no Kubernetes utilizando o Minikube e/ou DockerHub</title>
      <dc:creator>Marcus Paulo</dc:creator>
      <pubDate>Fri, 09 Apr 2021 14:28:27 +0000</pubDate>
      <link>https://forem.com/marcuspaulo/tutorial-disponibilizando-uma-aplicacao-quarkus-no-kubernetes-utilizando-o-minikube-e-ou-dockerhub-4ha9</link>
      <guid>https://forem.com/marcuspaulo/tutorial-disponibilizando-uma-aplicacao-quarkus-no-kubernetes-utilizando-o-minikube-e-ou-dockerhub-4ha9</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;O objetivo deste artigo é criar uma aplicação simples no Quarkus e em seguida mostrar como disponibilizar esta aplicação no Minikube (Kubernetes para testes na máquina local) e em seguida, como podemos enviar a imagem gerada para o repositório de imagens do Docker, que é o &lt;a href="https://hub.docker.com/"&gt;Dockerhub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para saber mais sobre o Kubernetes (K8S), Docker, Minikube, Kubectl e do Quarkus, eu recomendo as seguintes leituras:&lt;/p&gt;

&lt;h3&gt;
  
  
  Leituras adicionais
&lt;/h3&gt;

&lt;p&gt;Site oficial do Docker: &lt;a href="https://www.docker.com/"&gt;https://www.docker.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Site oficial do Kubernetes: &lt;a href="https://kubernetes.io/pt/"&gt;https://kubernetes.io/pt/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Site oficial do Minikube: &lt;a href="https://minikube.sigs.k8s.io/docs/start/"&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Minikube (Kubernetes): &lt;a href="https://kubernetes.io/pt/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/"&gt;https://kubernetes.io/pt/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Site oficial do Quarkus: &lt;a href="https://quarkus.io/"&gt;https://quarkus.io/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Publicações:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Tutorial: Quarkus do Zero até o Deploy no Heroku, utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres + Postman&lt;/strong&gt; &lt;a href="https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://medium.com/@marcus.paulo/tutorial-quarkus-do-zero-at%C3%A9-o-deploy-no-heroku-utilizando-quarkus-java-rest-cdi-panache-8d702caf451f"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman — &lt;/strong&gt;&lt;a href="https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://medium.com/@marcus.paulo/tutorial-criando-um-crud-utilizando-quarkus-java-rest-cdi-panache-hibernate-com-postgres-59793e0d7162"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Tutorial: Quarkus — Simplificando o Hibernate utilizando Panache — criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache — &lt;/strong&gt;&lt;a href="https://www.linkedin.com/pulse/tutorial-quarkus-simplificando-o-hibernate-panache-da-silva-melo/"&gt;Linkedin&lt;/a&gt; | &lt;a href="https://medium.com/@marcus.paulo/tutorial-quarkus-simplificando-o-hibernate-utilizando-panache-criando-uma-aplica%C3%A7%C3%A3o-simples-393134a58073"&gt;Medium&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção: O Minikube não deve ser utilizado em ambiente de produção.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Pré-Requisitos para esse tutorial
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Instalar o Docker: &lt;a href="https://docs.docker.com/engine/install/"&gt;https://docs.docker.com/engine/install/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instalar o Kubernetes: &lt;a href="https://kubernetes.io/pt/docs/setup/"&gt;https://kubernetes.io/pt/docs/setup/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instalar o Kubeclt: &lt;a href="https://kubernetes.io/docs/tasks/tools/"&gt;https://kubernetes.io/docs/tasks/tools/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instalação do Minikube: &lt;a href="https://minikube.sigs.k8s.io/docs/start/"&gt;https://minikube.sigs.k8s.io/docs/start/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Open JDK 11+: &lt;a href="https://openjdk.java.net/install/"&gt;https://openjdk.java.net/install/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para iniciar, vamos criar uma simples aplicação no Quarkus, seguindo os passos abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Criar o projeto no Quarkus
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn io.quarkus:quarkus-maven-plugin:1.13.0.Final:create \\    -DprojectGroupId=br.com.mp \\    -DprojectArtifactId=kubernetes-quarkus \\    -DclassName="br.com.mp.kubernetes.quarkus.rest.GreetingResource" \\    -Dpath="/hello" \\    -Dextensions="resteasy,kubernetes,jib"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Entre na pasta do projeto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd kubernetes-quarkus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testando o projeto
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn quarkus:dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resultado
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sRb_0K5M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A1YJUq5GO23ngM3RHTQanpQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sRb_0K5M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A1YJUq5GO23ngM3RHTQanpQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Executando uma aplicação Quarkus pela linha de comando&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando a dependência do Minikube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn quarkus:add-extension -Dextensions="quarkus-minikube"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou diretamente no Pom.xml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;  &amp;lt;groupId&amp;gt;io.quarkus&amp;lt;/groupId&amp;gt;  &amp;lt;artifactId&amp;gt;quarkus-minikube&amp;lt;/artifactId&amp;gt;&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A extensão do &lt;code&gt;**quarkus-minikube**&lt;/code&gt; poderia ter sido adicionada na linha de comando da criação da aplicação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Definindo o Minikube como Container Registry local
&lt;/h3&gt;

&lt;p&gt;Para transformar o Minikube em um Container Registry local (um repositório de imagens), basta executar a linha abaixo no terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eval $(minikube -p minikube docker-env)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gerando a imagem do Docker
&lt;/h3&gt;

&lt;p&gt;No próximo passo, será criada uma imagem Docker contendo a aplicação&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn package -Dquarkus.container-image.build=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Geração dos manifestos
&lt;/h3&gt;

&lt;p&gt;Após a criação da imagem, será gerada os manifestos do Kubernetes e Minikube, na pasta “&lt;strong&gt;/target/kubernetes”&lt;/strong&gt;, conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---jOBRz3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A4sKtcmd1jXa3qd4Kf1B5aw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---jOBRz3N--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A4sKtcmd1jXa3qd4Kf1B5aw.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Consultando a imagem gerada
&lt;/h3&gt;

&lt;p&gt;Utilizando o docker para consultar a imagem que foi gerada&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker image ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**[Resultado]**REPOSITORY                        TAG              IMAGE ID       CREATED         SIZEmarcus/kubernetes-quarkus-teste   1.0.0-SNAPSHOT   e574987218c4   3 minutes ago   199MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com a imagem já no Container Registry do Minikube, basta aplicar o manifesto do “&lt;strong&gt;minikube.yml”&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Aplicando os manifestos do Minikube
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f target/kubernetes/minikube.yml                        
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Resultado]service/kubernetes-quarkus-teste createddeployment.apps/kubernetes-quarkus-teste created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após alguns segundos, a aplicação estará disponível. No próximo comando, vamos listar os PODS.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pod&lt;/strong&gt; é a menor elemento do Kubernetes&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Consultando os PODS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl get po
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Resultado]NAME                                        READY   STATUS    RESTARTS   AGEkubernetes-quarkus-teste-54db4f8df8-gf7nf   1/1     Running   0          6m52s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Port-Forward para acessar na máquina local
&lt;/h3&gt;

&lt;p&gt;Para acessar a aplicação, é necessário redirecionar o endereço do Minikube para a máquina local, através do comando &lt;strong&gt;Port-forward&lt;/strong&gt;, para isso, &lt;strong&gt;copie o nome exato do seu pod&lt;/strong&gt;, conforme demonstrado abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl port-forward pod/kubernetes-quarkus-teste-54db4f8df8-gf7nf 8080:8080                     
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Resultado]Forwarding from 127.0.0.1:8080 -&amp;gt; 8080Forwarding from [::1]:8080 -&amp;gt; 8080Handling connection for 8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Acessando a aplicação que foi disponibilizada pelo Minikube
&lt;/h3&gt;

&lt;p&gt;Para acessar a aplicação, basta acessar o endereço: &lt;code&gt;[http://localhost:8080/](http://localhost:8080/)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3QAuHbVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A7Stxh1OQC1cC2YdXiDMIoQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3QAuHbVb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/800/1%2A7Stxh1OQC1cC2YdXiDMIoQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Enviando a imagem para o Dockerhub
&lt;/h3&gt;

&lt;p&gt;A partir de agora, enviaremos a imagem docker da Aplicação para o repositório de imagens do Dockerhub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enviando a imagem para o Dockerhub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean package -Dquarkus.container-image.push=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Erro ao enviar a imagem para o Dockerhub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Erro:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Caused by: com.google.cloud.tools.jib.api.RegistryUnauthorizedException: Unauthorized for registry-1.docker.io/marcus/kubernetes-quarkus-teste[ERROR]         at com.google.cloud.tools.jib.registry.RegistryEndpointCaller.call(RegistryEndpointCaller.java:164)[ERROR]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso ocorra o problema acima, é necessário realizar alguns procedimentos:&lt;/p&gt;

&lt;p&gt;1 — No terminal, faça o login na sua conta do Dockerhub&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2 — A imagem do Docker é criada de acordo com o nome do seu usuário do seu computador, no meu caso, a imagem foi criada como &lt;strong&gt;marcus/kubernetes-quarkus&lt;/strong&gt;, porém, o meu usuário no Dockerhub é &lt;strong&gt;marcuspaulo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Caso este seja o seu problema, basta definir o nome do seu usuário dentro das configurações no &lt;strong&gt;arquivo de propriedades&lt;/strong&gt; (application.properties) do Quarkus, conforme a linha abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;quarkus.container-image.group=marcuspaulo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enviando para o Dockerhub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn clean package -Dquarkus.container-image.push=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Consultando a imagem no Dockerhub, através do endereço: &lt;a href="https://hub.docker.com/repositories"&gt;https://hub.docker.com/repositories&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OMCgi2q0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a9ms65fbmifrtf0bverg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OMCgi2q0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a9ms65fbmifrtf0bverg.png" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que vocês tenham gostado, fico muito agradecido com o seu like e com o compartilhamento deste post, muito obrigado e até a próxima.&lt;/p&gt;

&lt;h1&gt;
  
  
  Código-fonte
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/marcuspaulo/kubernetes-quarkus"&gt;https://github.com/marcuspaulo/kubernetes-quarkus&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Referências
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/container-image#quarkus-container-image_quarkus.container-image.registry"&gt;https://quarkus.io/guides/container-image#quarkus-container-image_quarkus.container-image.registry&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/deploying-to-kubernetes"&gt;https://quarkus.io/guides/deploying-to-kubernetes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quarkus.io/guides/kubernetes-client"&gt;https://quarkus.io/guides/kubernetes-client&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://minikube.sigs.k8s.io/docs/handbook/registry/"&gt;https://minikube.sigs.k8s.io/docs/handbook/registry/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://haralduebele.blog/2020/04/03/deploy-your-quarkus-applications-on-kubernetes-almost-automatically/"&gt;https://haralduebele.blog/2020/04/03/deploy-your-quarkus-applications-on-kubernetes-almost-automatically/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>kubernetes</category>
      <category>docker</category>
      <category>minikube</category>
    </item>
    <item>
      <title>Simplificando o Hibernate utilizando Panache - criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache</title>
      <dc:creator>Marcus Paulo</dc:creator>
      <pubDate>Sun, 07 Feb 2021 03:03:05 +0000</pubDate>
      <link>https://forem.com/marcuspaulo/simplificando-o-hibernate-utilizando-panache-criando-uma-aplicacao-simples-utilizando-quarkus-java-rest-cdi-panache-14pj</link>
      <guid>https://forem.com/marcuspaulo/simplificando-o-hibernate-utilizando-panache-criando-uma-aplicacao-simples-utilizando-quarkus-java-rest-cdi-panache-14pj</guid>
      <description>&lt;h3&gt;
  
  
  Tutorial: Quarkus — Simplificando o Hibernate utilizando Panache — criando uma aplicação simples utilizando Quarkus Java + REST + CDI + Panache
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A6kNyK7zvhXQPvatTwp1zeg.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A6kNyK7zvhXQPvatTwp1zeg.jpeg" alt="Logo — Tartarugas e um Jacaré"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCzoyY_hIVs53dQUeY4yVkhA" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Se inscreva no meu canal do Youtube, vários conteúdos para Desenvolvedores: https://www.youtube.com/channel/UCzoyY_hIVs53dQUeY4yVkhA&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ArcTbDADz-U9nBVF4" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ArcTbDADz-U9nBVF4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Atqd_Zn8CsZVe00kM.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Atqd_Zn8CsZVe00kM.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Este artigo tem o objetivo de apresentar uma alternativa para simplificar a implementação da camada de persistência em uma aplicação Java. A maioria dos desenvolvedores Java conhecem a especificação &lt;a href="https://www.oracle.com/technetwork/java/javaee/tech/persistence-jsp-140049.html" rel="noopener noreferrer"&gt;JPA (Java Persistence API)&lt;/a&gt;, que é uma interface comum para frameworks que trabalham com persistência de dados. Uma das implementações mais conhecidas é o Hibernate.&lt;/p&gt;

&lt;p&gt;O Hibernate é um framework &lt;a href="https://stackoverflow.com/questions/1279613/what-is-an-orm-how-does-it-work-and-how-should-i-use-one" rel="noopener noreferrer"&gt;ORM (Mapeamento Objeto Relacional)&lt;/a&gt;, que tem como objetivo, facilitar o mapeamento das tabelas, atributos e relacionamentos de um banco de dados para uma classe java.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, podemos ver uma das formas para implementação de uma consulta para obter todos os carros de uma base de dados. No primeiro trecho de código, observamos a criação do &lt;a href="https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManagerFactory.html" rel="noopener noreferrer"&gt;EntityManagerFactory&lt;/a&gt; e em seguida a criação de um &lt;a href="https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html" rel="noopener noreferrer"&gt;EntityManager&lt;/a&gt;, por fim, a consulta é criada retornando a lista de carros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A16Z_Y5rKmTKdaDNL" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A16Z_Y5rKmTKdaDNL" alt="Implementação para retornar a lista de carros"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como forma de comparação, veja no exemplo abaixo, a mesma implementação da recuperação da lista de todos os carros, utilizando o Panache.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AUvCKOorcK8ziaAZ2" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AUvCKOorcK8ziaAZ2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O objetivo do Panache é simplificar a camada de persistência, principalmente das operações triviais.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No exemplo abaixo, podemos ver uma implementação para salvar um objeto carro no Banco de Dados. Explicando o código: O objeto carro é criado e “populado”, em seguida, ocorre a criação do EntityManagerFactory e do EntityManager. Antes de salvar o objeto é necessário abrir a conexão, salvar o carro e em seguida realizar o commit. Antes de terminar a execução do método é necessário fechar a conexão do banco de dados, através da instrução close();&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Aq6drdZ_KlN3-6bzf" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Aq6drdZ_KlN3-6bzf"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;* Exemplo adaptado da apostila da Caelum:&lt;/em&gt; &lt;a href="https://www.caelum.com.br/apostila-java-web/uma-introducao-pratica-ao-jpa-com-hibernate/#trabalhando-com-os-objetos-o-entitymanager" rel="noopener noreferrer"&gt;&lt;em&gt;https://www.caelum.com.br/apostila-java-web/uma-introducao-pratica-ao-jpa-com-hibernate/#trabalhando-com-os-objetos-o-entitymanager&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No código-fonte abaixo, segue a implementação do salvar, utilizando o Panache.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para utilizar os benefícios do Panache é necessário que a entidade estenda a classe PanacheBaseEntity. Dessa forma, a Classe que herda terá diversos métodos prontos para serem utilizados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Voltando para o código, na primeira parte do código o Carro é instanciado e “populado”, em seguida, invoca o método estático (persist) da Classe Carro para salvar o objeto no banco de dados, para finalizar devolve o objeto para a requisição &lt;em&gt;REST&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AGsbz-BfsTywa6_aW" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AGsbz-BfsTywa6_aW"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O Panache é responsável por gerenciar toda a transação, desde da abertura, commit e o fechamento da transação.&lt;/p&gt;

&lt;p&gt;A ideia é facilitar a implementação, melhorando assim a produtividade, já que o código fica bem mais simples, se comparado a forma tradicional.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Métodos da classe &lt;strong&gt;PanacheEntityBase&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ao estender a classe PanacheEntityBase, a classe herda vários métodos úteis, como: &lt;em&gt;Listar todos, salvar, atualizar, remover, buscar um objeto, retornar a quantidade de objetos de uma determinada tabela&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Listando carros com o nome Fusca, basta escrever: Car.find(“name”, “fusca”);&lt;/p&gt;

&lt;p&gt;Listando carros ordenados por nome, basta escrever: Car.find("order by name”)&lt;/p&gt;

&lt;p&gt;Métodos da classe PanacheEntityBase, para mais detalhes, veja o &lt;a href="https://github.com/quarkusio/quarkus/blob/master/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntityBase.java" rel="noopener noreferrer"&gt;código-fonte&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Abaixo a lista de métodos que são herdados, ao estender a classe PanacheEntityBase.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  persist — Persiste uma entidade no banco de dados.&lt;/li&gt;
&lt;li&gt;  flush — Realiza o commit ou rollback de todas as transações pendentes&lt;/li&gt;
&lt;li&gt;  findById — Busca uma entidade por meio do ID&lt;/li&gt;
&lt;li&gt;  find — Lista os registros de uma entidade. (Parâmetros de Filtros e Sort são opcionais)&lt;/li&gt;
&lt;li&gt;  findAll — Lista todos os registros de uma entidade.&lt;/li&gt;
&lt;li&gt;  list — Atalho para find().list()&lt;/li&gt;
&lt;li&gt;  listAll — Atalho para findAll().list()&lt;/li&gt;
&lt;li&gt;  Count — Exibe a quantidade de registros de uma entidade. Você pode passar um parâmetro que é opcional.&lt;/li&gt;
&lt;li&gt;  deleteAll — Remover uma lista de objetos do banco de dados.&lt;/li&gt;
&lt;li&gt;  delete — Remove uma entidade, podendo utilizar uma Query (Opcional)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Parte prática — Hands-on (Tutorial passo a passo)
&lt;/h3&gt;

&lt;p&gt;Para facilitar o entendimento do Framework Panache, será criado um projeto em Quarkus + Panache e um banco de dados em Postgres, mostrando os diversos cenários em que o Panache pode auxiliar o desenvolvedor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Para mais detalhes do Quarkus, veja o meu artigo: &lt;a href="https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/" rel="noopener noreferrer"&gt;https://www.linkedin.com/pulse/tutorial-criando-um-crud-utilizando-quarkus-java-rest-da-silva-melo/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Antes de iniciar o desenvolvimento da aplicação, é necessário atender os requisitos mínimos abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisitos mínimos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Você vai precisar de uma &lt;a href="https://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments#Java" rel="noopener noreferrer"&gt;IDE&lt;/a&gt; como por exemplo: &lt;a href="https://www.jetbrains.com/idea/download/" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;, &lt;a href="https://www.eclipse.org/downloads/" rel="noopener noreferrer"&gt;Eclipse&lt;/a&gt;, &lt;a href="https://code.visualstudio.com/Download" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Instale a &lt;a href="https://adoptopenjdk.net/" rel="noopener noreferrer"&gt;JDK 8 or 11+&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instale o &lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Apache Maven 3.5.3+&lt;/a&gt; ou o &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://quarkus.io/guides/hibernate-orm-panache" rel="noopener noreferrer"&gt;Panache Entity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Escolha um cliente para conectar com o Banco de dados, exemplo: &lt;a href="https://dbeaver.io/download/" rel="noopener noreferrer"&gt;DBeaver&lt;/a&gt;, &lt;a href="https://www.linkedin.com/redir/general-malware-page?url=https%3A%2F%2Fwww%2emysql%2ecom%2Fproducts%2Fworkbench%2F" rel="noopener noreferrer"&gt;MySql Workbench&lt;/a&gt;, entre outros.&lt;/li&gt;
&lt;li&gt;  Cliente para realizar requisições REST: &lt;a href="https://www.getpostman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; ou o &lt;a href="https://insomnia.rest/download/" rel="noopener noreferrer"&gt;Insomnia&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instruções Adicionais:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.docker.com/install/" rel="noopener noreferrer"&gt;Instalação do Docker (Documentação oficial)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=OweZAewo54A" rel="noopener noreferrer"&gt;Instalando Docker no windows&lt;/a&gt;: (Youtube, ESR)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=FTxBa7i8VMM" rel="noopener noreferrer"&gt;Instalando o Docker no Linux&lt;/a&gt;: (Youtube: LinuxTips)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=pFavwxt-4ig" rel="noopener noreferrer"&gt;Instalando o Docker no Mac:&lt;/a&gt; (Youtube: Wellington Rogati)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escopo da aplicação
&lt;/h3&gt;

&lt;p&gt;A partir de agora, vamos criar uma aplicação que será desenvolvida com o Quarkus, utilizando o Panache + Hibernate para persistência, CDI e JAX-RS para a API REST.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A aplicação consiste em realizar Cadastro, Alteração, Atualização, Listagem, Paginação, Consultas Personalizadas e entre outras funcionalidades do Panache para gerenciar os Carros cadastrados no banco de dados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;// Criação do projeto em Quarkus  &lt;/p&gt;

&lt;p&gt;mvn io.quarkus:quarkus-maven-plugin:1.0.1.Final:create \&lt;br&gt;&lt;br&gt;
     -DprojectGroupId=br.com.car \&lt;br&gt;&lt;br&gt;
     -DprojectArtifactId=quarkus-panache-car \&lt;br&gt;&lt;br&gt;
     -DclassName="br.com.car.resource.CarResource" \&lt;br&gt;&lt;br&gt;
     -Dpath="/cars"&lt;/p&gt;

&lt;p&gt;Em seguida, vamos executar o projeto, através do comando:&lt;/p&gt;

&lt;p&gt;mvn compile quarkus:dev&lt;/p&gt;

&lt;p&gt;No navegador, acesse o endereço: &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Ar2OVdywpN-i4HcTI" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Ar2OVdywpN-i4HcTI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configurando o Panache no Projeto
&lt;/h3&gt;

&lt;p&gt;Adiciona as configurações abaixo no arquivo application.properties, na pasta resource na raiz do projeto.&lt;/p&gt;
&lt;h1&gt;
  
  
  configure your datasource
&lt;/h1&gt;

&lt;p&gt;quarkus.datasource.url = jdbc:postgresql://localhost:5433/quarkus-panache-car&lt;br&gt;&lt;br&gt;
quarkus.datasource.driver = org.postgresql.Driver&lt;br&gt;&lt;br&gt;
quarkus.datasource.username = postgres&lt;br&gt;&lt;br&gt;
quarkus.datasource.password = postgres  &lt;/p&gt;
&lt;h1&gt;
  
  
  drop and create the database at startup (use &lt;code&gt;update&lt;/code&gt; to only update the schema)
&lt;/h1&gt;

&lt;p&gt;quarkus.hibernate-orm.database.generation = drop-and-create&lt;/p&gt;
&lt;h3&gt;
  
  
  Adicione as dependências do Panache no pom.xml.
&lt;/h3&gt;

  

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-hibernate-orm-panache&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-jdbc-postgresql&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-resteasy-jsonb&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: Para criar a massa de dados no início da aplicação, basta adicionar o arquivo import.sql, dentro da pasta resource do projeto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Executando uma instância do Postgresql no Docker
&lt;/h3&gt;

&lt;p&gt;Para armazenar as informações, iniciaremos uma instância do Postgresql, utilizando o Docker, para isso, é necessário ter o Docker instalado e então executar o comando listado abaixo:&lt;/p&gt;

&lt;h1&gt;
  
  
  Criando uma instância do Postgressql através do Docker
&lt;/h1&gt;

&lt;p&gt;docker run --name postgres-car -e "POSTGRES_PASSWORD=postgres" -p 5433:5432 -v ~/developer/PostgreSQL:/var/lib/postgresql/data -d postgres&lt;/p&gt;

&lt;h3&gt;
  
  
  Entidade Car (o modelo da aplicação)
&lt;/h3&gt;

&lt;p&gt;@Entity&lt;br&gt;&lt;br&gt;
public class Car extends PanacheEntityBase {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long id;

private String brand;

private String name;

@Column(name="model_year")  
private LocalDate modelYear;

@Column(name="created_date_time")  
private LocalDateTime createdDateTime;

@Column(name="is_available_sale")  
private Boolean isAvailableSale;

private BigDecimal price;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;// Omitido&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Observação&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;: O atributo Id (Chave Primária) é opcional, quando a classe estende o PanacheEntityBase&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testando a aplicação
&lt;/h3&gt;

&lt;p&gt;Para fins didáticos, vamos separa os testes em duas partes, a primeira será utilizando os métodos do &lt;em&gt;PanacheEntityBase&lt;/em&gt;, dentro da classe &lt;em&gt;Resource (EndPoint)&lt;/em&gt;. A segunda parte, será utilizando uma classe &lt;em&gt;Repository + Resource(EndPoint)&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Observação 1&lt;/strong&gt;: Outra forma seria criar uma camada de Serviço (Service) para “chamar” os métodos de uma classe &lt;a href="https://en.wikipedia.org/wiki/Data_access_object" rel="noopener noreferrer"&gt;DAO&lt;/a&gt; ou de um Repositório.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observação 2&lt;/strong&gt;: Sinta-se a vontade para definir o melhor padrão de sufixos de nomes, exemplo: Camada do EndPoint (API/Rest): (Controller, EndPoint, …). Camada de Negócio: (Controller, Manager, Business, ….) e assim por diante.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Listando todos os Carros (Versão 1)
&lt;/h3&gt;

&lt;p&gt;Para acessar a lista de todos os carros, basta chamar o método estático da classe Car, que é herdado a partir do PanacheEntityBase.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;("/cars")&lt;br&gt;&lt;br&gt;
@Produces(MediaType.APPLICATION_JSON)&lt;br&gt;&lt;br&gt;
public class CarResource {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@GET  
public List&amp;lt;Car&amp;gt; listAll() {  
    return Car.listAll();

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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Resultado no Postman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AOIv9i-epzy2csWje" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AOIv9i-epzy2csWje"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro forma é implementar na classe de sufixo Repository ou na classe DAO. A implementação será utilizando a classe DAO ou Repository, bastando implementar &lt;em&gt;PanacheRepository&lt;/em&gt;, conforme o exemplo abaixo:&lt;/p&gt;

&lt;p&gt;@ApplicationScoped&lt;br&gt;&lt;br&gt;
public class CarRepository implements PanacheRepository {&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public List&amp;lt;Car&amp;gt; listAll() {  
    return listAll();  
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;// omitido&lt;/p&gt;

&lt;p&gt;A implementação na classe &lt;strong&gt;CarV2Resource&lt;/strong&gt; (EndPoint Rest):&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;("/cars/v2")&lt;br&gt;&lt;br&gt;
@Produces(MediaType.APPLICATION_JSON)&lt;br&gt;&lt;br&gt;
public class CarV2Resource {&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Inject&lt;br&gt;&lt;br&gt;
private CarRepository carRepository;

&lt;p&gt;@GET&lt;br&gt;&lt;br&gt;
public List&amp;lt;Car&amp;gt; listAll() {&lt;br&gt;&lt;br&gt;
    return carRepository.listAll();&lt;/p&gt;

&lt;p&gt;}&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Postman — Listar todos os veículos na versão 2 da API&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;O resultado é exatamente igual, quando implementado diretamente na classe do Endpoint da API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AleFrmntXW9kP2G2X" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AleFrmntXW9kP2G2X"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um veículo (Versão 1)
&lt;/h3&gt;

&lt;p&gt;Criando um veículo, invocando o método estático da Classe Car, dentro da CarResource(EndPoint), conforme exemplo abaixo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A anotação @Transactional é responsável por gerenciar a transação efetuando um commit ou um rollback na transação, caso seja necessário;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/post"&gt;@post&lt;/a&gt;&lt;br&gt;&lt;br&gt;
@Transactional&lt;br&gt;&lt;br&gt;
public Response create(Car car) {&lt;br&gt;&lt;br&gt;
    Car.persist(car);&lt;br&gt;&lt;br&gt;
    return Response.ok(car).status(Response.Status.CREATED).build();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h3&gt;
  
  
  Evoluindo a criação de um veículo
&lt;/h3&gt;

&lt;p&gt;No endpoint CarV2Resource, basta chamar o método &lt;em&gt;save&lt;/em&gt;, que está implementado no &lt;em&gt;PanacheRepository&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Classe: CarV2Resource.java&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/post"&gt;@post&lt;/a&gt;&lt;br&gt;&lt;br&gt;
public Response create(Car car) {&lt;br&gt;&lt;br&gt;
    Car carEntity = carRepository.save(car);&lt;br&gt;&lt;br&gt;
    return Response.ok(car).status(Response.Status.CREATED).build();&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman — Resultado da inclusão de um veículo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2APOPxWSRr0NeExNiy" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2APOPxWSRr0NeExNiy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listando os carros por ano
&lt;/h3&gt;

&lt;p&gt;// CarResource.java&lt;/p&gt;

&lt;p&gt;@GET&lt;br&gt;&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;("/listCarsByYear")&lt;br&gt;&lt;br&gt;
public List listCarsByYear(@QueryParam("year") int year) {&lt;br&gt;&lt;br&gt;
    return Car.find("year(modelYear) = :year", Parameters.with("year",&lt;br&gt;&lt;br&gt;
year)).list();  &lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Na versão 2, a implementação utiliza o &lt;em&gt;carRepository&lt;/em&gt; e chama o método &lt;em&gt;listCarsByYear(year)&lt;/em&gt;;&lt;/p&gt;

&lt;p&gt;// CarV2Resource.java&lt;/p&gt;

&lt;p&gt;@GET&lt;br&gt;&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;("/listCarsByYear")&lt;br&gt;&lt;br&gt;
public List listCarsByYear(@QueryParam("year") int year) {&lt;br&gt;&lt;br&gt;
    return carRepository.listCarsByYear(year);&lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Implementação da lógica de pesquisa de carro por ano, na classe CarRepository.java&lt;/p&gt;

&lt;p&gt;//CarRepository.java&lt;/p&gt;

&lt;p&gt;public List listCarsByYear(int year) {&lt;br&gt;&lt;br&gt;
    return find("year(modelYear) = :year", Parameters.with("year", year)).list();  &lt;/p&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman — Resultado da busca de veículos por ano
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AFNvUuna9XIaED_og" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AFNvUuna9XIaED_og"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Outros métodos:
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Listar todos os carros que estão disponíveis para venda
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A8yMULJuTCnQDrcL6" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A8yMULJuTCnQDrcL6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listar todos os veículos ordenados por Nome e Marca.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2An27bnCodpTFvFaZp" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2An27bnCodpTFvFaZp"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listar todos os veículos passando o ano como Parâmetro
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Ajwi7ECsAKgS7pxS7" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Ajwi7ECsAKgS7pxS7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Retornar a quantidade de veículos cadastrados&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A_JSjiaH0JK3W4Duo" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A_JSjiaH0JK3W4Duo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listar veículos com paginação
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ABafmuTvMIqwmo0JF" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ABafmuTvMIqwmo0JF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizar veículo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ATnPhze5aooM4pE2J" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2ATnPhze5aooM4pE2J"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Espero que vocês tenham gostado, sinta-se à vontade para sugerir, criticar ou elogiar. Um grande abraço e até a próxima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Código-Fonte
&lt;/h3&gt;

&lt;p&gt;O código-fonte está disponível no endereço: &lt;a href="https://github.com/marcuspaulo/quarkus-panache-car" rel="noopener noreferrer"&gt;https://github.com/marcuspaulo/quarkus-panache-car&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>panache</category>
      <category>jpa</category>
      <category>hibernate</category>
    </item>
    <item>
      <title>Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman</title>
      <dc:creator>Marcus Paulo</dc:creator>
      <pubDate>Mon, 01 Feb 2021 12:28:33 +0000</pubDate>
      <link>https://forem.com/marcuspaulo/tutorial-criando-um-crud-utilizando-quarkus-java-rest-cdi-panache-hibernate-com-postgres-docker-postman-5bk6</link>
      <guid>https://forem.com/marcuspaulo/tutorial-criando-um-crud-utilizando-quarkus-java-rest-cdi-panache-hibernate-com-postgres-docker-postman-5bk6</guid>
      <description>&lt;h3&gt;
  
  
  Tutorial: Criando um CRUD utilizando Quarkus Java + REST + CDI + Panache, Hibernate com Postgres (Docker) + Postman
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCzoyY_hIVs53dQUeY4yVkhA" rel="noopener noreferrer"&gt;&lt;strong&gt;Se inscreva no meu canal do Youtube, vários conteúdos para Desenvolvedores: https://www.youtube.com/channel/UCzoyY_hIVs53dQUeY4yVkhA&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A5DrjPTcfjAJajWz5ERyNfw.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2A5DrjPTcfjAJajWz5ERyNfw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;Os programadores de Java estão “cansados” de ouvir as seguintes expressões: “Java é lento!”, “O pacote do java é grande”, “O tempo de inicialização é lento!”. Como uma forma de resolver isso, a &lt;a href="https://www.redhat.com/" rel="noopener noreferrer"&gt;Red Hat&lt;/a&gt; lançou o &lt;a href="http://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt;, um framework Java nativo do &lt;a href="https://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; feito sob medida para o &lt;a href="https://www.graalvm.org/" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt; e &lt;a href="https://openjdk.java.net/" rel="noopener noreferrer"&gt;OpenJDK HotSpot&lt;/a&gt;. O &lt;a href="http://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt; visa tornar o &lt;a href="https://www.java.com/pt_BR/" rel="noopener noreferrer"&gt;java&lt;/a&gt; uma plataforma líder em ambientes serverless e &lt;a href="http://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;, oferecendo aos desenvolvedores um modelo unificado de &lt;a href="https://medium.com/alexandre-malavasi/descomplicando-programa%C3%A7%C3%A3o-imperativa-declarativa-e-reativa-a481baa87742" rel="noopener noreferrer"&gt;programação reativa e imperativa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AMW2Z3ZamB86Wj-58" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AMW2Z3ZamB86Wj-58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;QuarkusIO&lt;/a&gt;, promete entregar pacotes menores, com um tempo de inicialização extremanente rápido, menor consumo de memória, desde que combinado com a &lt;a href="https://www.graalvm.org/" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt;, O Quarkus vai realizar a compilação &lt;a href="https://openjdk.java.net/jeps/295" rel="noopener noreferrer"&gt;Ahead-of-time(AOT)&lt;/a&gt;. Baseada nos melhores padrões, plataforma integrada, baixo consumo de processamento e tempo de inicialização é incrivelmente rápido, em milisegundos, Quarkus permite o uso do Java em ambientes serverless, suportando um ambiente responsivo e escalável.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo, podemos ver a comparação do consumo e memória e o tempo de inicialização + tempo da resposta da primeira requisição, podemos perceber que o Quarkus + OpenJDK + GraalVM, consomem menos memória e iniciam mais rapidamente, do que a o Quarkus + OpenJDK e um framework equivalente de mercado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A63Q0D7QX_a8PwJdX" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A63Q0D7QX_a8PwJdX"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um grande diferencial do Quarkus é que ele suporta as principais especificações, ou seja, você, não precisa aprender nada de novo. Por exemplo, você pode utilizar o &lt;a href="https://blog.caelum.com.br/use-cdi-no-seu-proximo-projeto-java/" rel="noopener noreferrer"&gt;CDI&lt;/a&gt; e &lt;a href="https://docs.oracle.com/javaee/6/tutorial/doc/giepu.html" rel="noopener noreferrer"&gt;JAX-RS&lt;/a&gt;, também é possível suportar as extensões como: &lt;a href="https://hibernate.org/" rel="noopener noreferrer"&gt;Hibernate&lt;/a&gt;, &lt;a href="https://kafka.apache.org/" rel="noopener noreferrer"&gt;Kafka&lt;/a&gt;, &lt;a href="https://www.openshift.com/" rel="noopener noreferrer"&gt;OpenShift&lt;/a&gt;, &lt;a href="http://kubernetes.io/" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;. Na era do cloud, no qual containers, Kubernetes, microservices, functions-as-a-service (Faas), e aplicações nativas para o cloud estão apresentando altos níveis de produtividade e eficiência, o Quarkus surge com uma alternativa muito interessante.&lt;/p&gt;

&lt;p&gt;Antes de continuar o post, gostaria de compartilhar a apresentação que fiz nesse ano.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apresentação no Evento Brasília Dev Festival 2019
&lt;/h3&gt;

&lt;p&gt;Em Setembro de 2019, palestrei no evento &lt;a href="https://www.sympla.com.br/brasilia-dev-festival-2019__581528" rel="noopener noreferrer"&gt;Brasília Dev Festival&lt;/a&gt;, realizado em Brasília, foi um evento recheado de muito conhecimento e network, a apresentação está disponível abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Parte prática — Hands-on (Tutorial passo a passo)
&lt;/h3&gt;

&lt;p&gt;Antes de iniciar o desenvolvimento da aplicação, é necessário atender os requisitos mínimos abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Requisitos mínimos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Você vai precisar de uma &lt;a href="https://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments#Java" rel="noopener noreferrer"&gt;IDE&lt;/a&gt; como por exemplo: &lt;a href="https://www.jetbrains.com/idea/download/" rel="noopener noreferrer"&gt;IntelliJ IDEA&lt;/a&gt;, &lt;a href="https://www.eclipse.org/downloads/" rel="noopener noreferrer"&gt;Eclipse&lt;/a&gt;, &lt;a href="https://code.visualstudio.com/Download" rel="noopener noreferrer"&gt;VSCode&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;  Instale a &lt;a href="https://adoptopenjdk.net/" rel="noopener noreferrer"&gt;JDK 8 or 11+&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Instale o &lt;a href="https://maven.apache.org/" rel="noopener noreferrer"&gt;Apache Maven 3.5.3+&lt;/a&gt; ou o &lt;a href="https://gradle.org/" rel="noopener noreferrer"&gt;Gradle&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  (Opcional) — Você pode baixar o &lt;a href="https://www.graalvm.org/" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt; 19.2.1 para compilar nativamente sua aplicação.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://quarkus.io/guides/hibernate-orm-panache" rel="noopener noreferrer"&gt;Panache Entity&lt;/a&gt; (Possível artigo futuro)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Escolha um cliente para conectar com o Banco de dados, exemplo: &lt;a href="https://dbeaver.io/download/" rel="noopener noreferrer"&gt;DBeaver&lt;/a&gt;, &lt;a href="https://www.pgadmin.org/" rel="noopener noreferrer"&gt;PGAdmin&lt;/a&gt;, &lt;a href="https://eggerapps.at/postico/" rel="noopener noreferrer"&gt;Postico (Mac)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  Cliente para realizar requisições REST: &lt;a href="https://www.getpostman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; ou o &lt;a href="https://insomnia.rest/download/" rel="noopener noreferrer"&gt;Insomnia&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Instruções Adicionais:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://docs.docker.com/install/" rel="noopener noreferrer"&gt;Instalação do Docker (Documentação oficial)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=OweZAewo54A" rel="noopener noreferrer"&gt;Instalando Docker no windows&lt;/a&gt;: (Youtube, ESR)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=FTxBa7i8VMM" rel="noopener noreferrer"&gt;Instalando o Docker no Linux&lt;/a&gt;: (Youtube: LinuxTips)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.youtube.com/watch?v=pFavwxt-4ig" rel="noopener noreferrer"&gt;Instalando o Docker no Mac:&lt;/a&gt; (Youtube: Wellington Rogati)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Escopo da aplicação
&lt;/h3&gt;

&lt;p&gt;A partir de agora, vamos criar uma aplicação que será desenvolvida com o Quarkus, utilizando o Panache + Hibernate para persistência, vamos utilizar o CDI para Injeção de Dependência e JAX-RS para a API REST.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Vamos criar uma API para Listar, Cadastrar, Editar e Excluir alimentos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O Quarkus possui um Archetype para criação da aplicação de forma fácil, basta executar o comando abaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Sugestão: verifique a última versão no site oficial do&lt;/strong&gt; &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;Quarkus.io&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mvn io.quarkus:quarkus-maven-plugin:1.11.1.Final:create \&lt;br&gt;&lt;br&gt;
     -DprojectGroupId=br.com.food \&lt;br&gt;&lt;br&gt;
     -DprojectArtifactId=quarkus-food \&lt;br&gt;&lt;br&gt;
     -DclassName="br.com.food.resource.FoodResource" \&lt;br&gt;&lt;br&gt;
     -Dpath="/food"&lt;/p&gt;

&lt;p&gt;$ cd quarkus-food&lt;/p&gt;

&lt;p&gt;Vamos entender o que cada trecho significa:&lt;/p&gt;
&lt;h1&gt;
  
  
  Plugin do Maven para criação do Projeto no Quarkus
&lt;/h1&gt;

&lt;p&gt;$ mvn io.quarkus:quarkus-maven-plugin:1.11.1.Final:create&lt;/p&gt;
&lt;h1&gt;
  
  
  Definição do pacote do projeto
&lt;/h1&gt;

&lt;p&gt;-DprojectGroupId=br.com.food&lt;/p&gt;
&lt;h1&gt;
  
  
  Definição do Nome do Projeto
&lt;/h1&gt;

&lt;p&gt;-DprojectArtifactId=quarkus-food&lt;/p&gt;
&lt;h1&gt;
  
  
  Definindo o caminho da classe Rest (inicial)
&lt;/h1&gt;

&lt;p&gt;-DclassName="br.com.food.resource.FoodResource"&lt;/p&gt;
&lt;h1&gt;
  
  
  Definição da URI, final do endereço para acessar no navegador
&lt;/h1&gt;

&lt;p&gt;-Dpath="/food&lt;/p&gt;

&lt;p&gt;O Quarkus disponibiliza um site chamado &lt;a href="https://code.quarkus.io/" rel="noopener noreferrer"&gt;Quarkus.code.io&lt;/a&gt;, onde é posísvel configurar o projeto de uma forma mais visual, vale a pena conferir, segue o link: &lt;a href="https://code.quarkus.io/" rel="noopener noreferrer"&gt;https://code.quarkus.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2Ao89osaxaalTeTkmdEAhXBw.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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%2Ao89osaxaalTeTkmdEAhXBw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Site: code.quarkus.io&lt;/p&gt;
&lt;h3&gt;
  
  
  Criando o projeto — Executando o comando de criação
&lt;/h3&gt;

&lt;p&gt;mvn io.quarkus:quarkus-maven-plugin:1.11.1.Final:create \  &lt;/p&gt;

&lt;blockquote&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-DprojectGroupId=br.com.mp \  
-DprojectArtifactId=food \  
-DclassName="br.com.mp.FoodResource" \  
-Dpath="/food"
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;// Log omitido&lt;br&gt;&lt;br&gt;
[INFO] Your application will be accessible on &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[INFO] ------------------------------------------------------------------------&lt;br&gt;&lt;br&gt;
[INFO] BUILD SUCCESS&lt;br&gt;&lt;br&gt;
[INFO] ------------------------------------------------------------------------&lt;br&gt;&lt;br&gt;
[INFO] Total time:  42.305 s&lt;br&gt;&lt;br&gt;
[INFO] Finished at: 2019-12-12T09:36:11-02:00&lt;br&gt;&lt;br&gt;
[INFO] ------------------------------------------------------------------------&lt;/p&gt;

&lt;p&gt;Log completo você encontra aqui: &lt;a href="https://pastebin.com/UfczCUDL" rel="noopener noreferrer"&gt;https://pastebin.com/UfczCUDL&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: A criação do projeto pode levar um tempo, já que o Maven, irá realizar o download de todas as dependências&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Abra a aplicação em sua IDE preferida
&lt;/h3&gt;

&lt;p&gt;Para esse exemplo, estou utilizando o InteliJ, porém, gosto bastante do Eclipse e Visual code, sinta-se a vontade para escolher sua IDE favorita.&lt;/p&gt;

&lt;p&gt;Na imagem abaixo, podemos ver a estrutura do projeto (Maven), ressaltando a criação dos arquivos dentro da pasta Docker, Dockerfile.jvm e Dockerfile.native, que pretendo falar em um outro artigo. Logo abaixo, veremos o arquivo FoodResource, essa classe é a responsável por “expor” a API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A_np4Y_KFaEkvnZ0X" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A_np4Y_KFaEkvnZ0X"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Executando o projeto inicial
&lt;/h3&gt;

&lt;p&gt;No terminal, execute o comando abaixo:&lt;/p&gt;

&lt;p&gt;mvn compile quarkus:dev&lt;/p&gt;

&lt;p&gt;Resultado da execução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Possivelmente, na primeira execução o compilador irá verificar se existe alguma dependência para baixar, como no exemplo abaixo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;[INFO] Scanning for projects...&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] ---------------------------&amp;lt; br.com.mp:food &amp;gt;---------------------------&lt;br&gt;&lt;br&gt;
[INFO] Building food 1.0-SNAPSHOT&lt;br&gt;&lt;br&gt;
[INFO] --------------------------------[ jar ]---------------------------------&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ food ---&lt;br&gt;&lt;br&gt;
[INFO] Using 'UTF-8' encoding to copy filtered resources.&lt;br&gt;&lt;br&gt;
[INFO] Copying 2 resources&lt;br&gt;&lt;br&gt;
// LOG OMITIDO&lt;br&gt;&lt;br&gt;
[INFO] ---------------------------&amp;lt; br.com.mp:food &amp;gt;---------------------------&lt;br&gt;&lt;br&gt;
[INFO] Building food 1.0-SNAPSHOT&lt;br&gt;&lt;br&gt;
[INFO] --------------------------------[ jar ]---------------------------------&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ food ---&lt;br&gt;&lt;br&gt;
2019-12-12 15:12:19,730 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Quarkus 1.0.1.Final started in 0.735s. Listening on: &lt;a href="http://0.0.0.0:8080" rel="noopener noreferrer"&gt;http://0.0.0.0:8080&lt;/a&gt;&lt;br&gt;&lt;br&gt;
2019-12-12 15:12:19,740 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Profile dev activated. Live Coding activated.&lt;br&gt;&lt;br&gt;
2019-12-12 15:12:19,741 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Installed features: [cdi, resteasy]&lt;/p&gt;

&lt;p&gt;Log completo da execução da aplicação: &lt;a href="https://pastebin.com/pnLdVYsc" rel="noopener noreferrer"&gt;https://pastebin.com/pnLdVYsc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No final Log, aparece a URL para acessar com o navegador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Quarkus 1.0.1.Final started in 0.735s. Listening on: &lt;a href="http://0.0.0.0:8080" rel="noopener noreferrer"&gt;http://0.0.0.0:8080&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Você pode acessar a API através dos endereços: &lt;a href="http://localhost:8080," rel="noopener noreferrer"&gt;http://localhost:8080,&lt;/a&gt; &lt;a href="http://0.0.0.0:8080" rel="noopener noreferrer"&gt;http://0.0.0.0:8080&lt;/a&gt; ou &lt;a href="http://127.0.0.1:8080." rel="noopener noreferrer"&gt;http://127.0.0.1:8080.&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para acessar a página, basta clicar no endereço exposto no terminal ou simplesmente copiar e colar no seu navegador, como mostrado no exemplo abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A35XhTaM2Je0WAkuE" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2A35XhTaM2Je0WAkuE"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Testando a API /food, através do navegador
&lt;/h3&gt;

&lt;p&gt;A URI da nossa API está definida inicialmente na classe FoodResource.java, com o caminho : /food&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AKM0HxddtB87IpGt2" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AKM0HxddtB87IpGt2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Abra o navegador e digite o endereço: &lt;a href="http://localhost:8080/food," rel="noopener noreferrer"&gt;http://localhost:8080/food,&lt;/a&gt; conforme a imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AVt7hkOGFOjW5o-c4" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AVt7hkOGFOjW5o-c4"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Executando uma instância do Postgresql no Docker
&lt;/h3&gt;

&lt;p&gt;Para armazenar as informações, vamos subir uma instância do Postgresql, utilizando o Docker, para isso, é necessário ter o Docker instalado e executar o comando listado abaixo:&lt;/p&gt;
&lt;h1&gt;
  
  
  Criando uma instância do Postgressql através do Docker
&lt;/h1&gt;

&lt;p&gt;docker run --name postgres-food -e "POSTGRES_PASSWORD=postgres" -p 5433:5432 -v ~/developer/PostgreSQL:/var/lib/postgresql/data -d postgres&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: Precisei mudar a porta padrão de 5432 para 5433, já que tinha uma outra instância rodando aqui.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Vamos testar a conexão com o Banco de dados, no meu caso, eu estou utilizando o DBeaver 6.1.0, porém, existem diversas outras aplicações para conectar com o Banco de Dados PostgreSQL, abaixo, segue o teste da conexão do banco de dados:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AKPkBWQqIZIuXcZ80" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AKPkBWQqIZIuXcZ80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No cliente SQL, vamos abrir o schema do Banco de dados e percebemos que o mesmo está vazio, não existe nenhuma tabela criada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AXxjZCaN7s6DqYKfs" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AXxjZCaN7s6DqYKfs"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Voltando para a nossa aplicação
&lt;/h3&gt;

&lt;p&gt;Retorne para sua IDE e adicione as seguintes dependências para o PanacheEntity e a dependência do Postgresql, as informações devem ser adicionadas no arquivo pom.xml (Na raiz do projeto).&lt;/p&gt;

  

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-hibernate-orm-panache&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-jdbc-postgresql&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
  io.quarkus&lt;br&gt;&lt;br&gt;
  quarkus-resteasy-jsonb&lt;/p&gt;



&lt;blockquote&gt;
&lt;p&gt;O Panache Entity visa facilitar a implementação da camada de persistência da aplicação. Além disso, o framework trás diversos métodos como Count, ListAll(), findById, persist, delete já implementados, conforme exibido código abaixo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Exemplo do PanacheEntity (Retirado do site: &lt;a href="https://quarkus.io/guides/hibernate-orm-panache" rel="noopener noreferrer"&gt;https://quarkus.io/guides/hibernate-orm-panache&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;// creating a person&lt;br&gt;&lt;br&gt;
Person person = new Person();&lt;br&gt;&lt;br&gt;
person.name = "Stef";&lt;br&gt;&lt;br&gt;
person.birth = LocalDate.of(1910, Month.FEBRUARY, 1);&lt;br&gt;&lt;br&gt;
person.status = Status.Alive;&lt;/p&gt;

&lt;p&gt;// persist it&lt;br&gt;&lt;br&gt;
person.persist();&lt;/p&gt;

&lt;p&gt;// note that once persisted, you don't need to explicitly save your entity: all&lt;br&gt;&lt;br&gt;
// modifications are automatically persisted on transaction commit.&lt;/p&gt;

&lt;p&gt;// check if it's persistent&lt;br&gt;&lt;br&gt;
if(person.isPersistent()){&lt;br&gt;&lt;br&gt;
    // delete it&lt;br&gt;&lt;br&gt;
    person.delete();&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;// getting a list of all Person entities&lt;br&gt;&lt;br&gt;
List allPersons = Person.listAll();&lt;/p&gt;

&lt;p&gt;// finding a specific person by ID&lt;br&gt;&lt;br&gt;
person = Person.findById(personId);&lt;/p&gt;

&lt;p&gt;// finding all living persons&lt;br&gt;&lt;br&gt;
List livingPersons = Person.list("status", Status.Alive);&lt;/p&gt;

&lt;p&gt;// counting all persons&lt;br&gt;&lt;br&gt;
long countAll = Person.count();&lt;/p&gt;

&lt;p&gt;// counting all living persons&lt;br&gt;&lt;br&gt;
long countAlive = Person.count("status", Status.Alive);&lt;/p&gt;

&lt;p&gt;// delete all living persons&lt;br&gt;&lt;br&gt;
Person.delete("status", Status.Alive);&lt;/p&gt;

&lt;p&gt;// delete all persons&lt;br&gt;&lt;br&gt;
Person.deleteAll();&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: O PanacheEntity é muito interessante, porém, vou explicar melhor em um artigo futuro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Voltando para a implementação da classe de modelo (Entity)
&lt;/h3&gt;

&lt;p&gt;Na IDE, crie a classe (Entidade): Food.java, dentro da pasta br.com.food.entity.&lt;/p&gt;

&lt;p&gt;Classe: Food.java&lt;/p&gt;

&lt;p&gt;package br.com.food.entity;&lt;/p&gt;

&lt;p&gt;import io.quarkus.hibernate.orm.panache.PanacheEntityBase;&lt;/p&gt;

&lt;p&gt;import javax.persistence.*;&lt;br&gt;&lt;br&gt;
import java.util.Objects;&lt;/p&gt;

&lt;p&gt;@Entity&lt;br&gt;&lt;br&gt;
public class Food extends PanacheEntityBase {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY)  
private Long id;  

@Column  
private String name;  

@Column  
private Double calories;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;// Omitido&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;h3&gt;
  
  
  Configurando a conexão de Banco de dados no projeto
&lt;/h3&gt;

&lt;p&gt;Procure o arquivo application.properties, dentro da pasta resources e adicione as seguintes configurações:&lt;/p&gt;

&lt;h1&gt;
  
  
  configure your datasource
&lt;/h1&gt;

&lt;p&gt;quarkus.datasource.url = jdbc:postgresql://localhost:5433/food&lt;br&gt;&lt;br&gt;
quarkus.datasource.driver = org.postgresql.Driver&lt;br&gt;&lt;br&gt;
quarkus.datasource.username = postgres&lt;br&gt;&lt;br&gt;
quarkus.datasource.password = postgres&lt;/p&gt;

&lt;h1&gt;
  
  
  drop and create the database at startup (use &lt;code&gt;update&lt;/code&gt; to only update the schema)
&lt;/h1&gt;

&lt;p&gt;quarkus.hibernate-orm.database.generation = drop-and-create&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ao executar nossa aplicação, nos deparamos com o seguinte problema: Caused by: org.postgresql.util.PSQLException: FATAL: database “food” does not exist&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Caused by: org.postgresql.util.PSQLException: FATAL: database "food" does not exist&lt;br&gt;&lt;br&gt;
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2468)&lt;br&gt;&lt;br&gt;
        at org.postgresql.core.v3.QueryExecutorImpl.readStartupMessages(QueryExecutorImpl.java:2587)&lt;br&gt;&lt;br&gt;
        at org.postgresql.core.v3.QueryExecutorImpl.(QueryExecutorImpl.java:134)&lt;br&gt;&lt;br&gt;
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:250)&lt;br&gt;&lt;br&gt;
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)&lt;br&gt;&lt;br&gt;
        at org.postgresql.jdbc.PgConnection.(PgConnection.java:195)&lt;br&gt;&lt;br&gt;
        at org.postgresql.Driver.makeConnection(Driver.java:458)&lt;br&gt;&lt;br&gt;
        at org.postgresql.Driver.connect(Driver.java:260)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Solução: Criar um Database no Postgresql, através do ClienteSQL&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AHkKziu22zWScQ5Yz" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AHkKziu22zWScQ5Yz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AvBeDC7LDFhmIHGP8" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AvBeDC7LDFhmIHGP8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Executando a aplicação com o Banco de Dados configurado
&lt;/h3&gt;

&lt;p&gt;Retornando para a nossa IDE, vamos executar o comando que irá iniciar nossa aplicação:&lt;/p&gt;

&lt;p&gt;$ mvn compile quarkus:dev  &lt;/p&gt;

&lt;p&gt;[INFO] Scanning for projects...&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --------------------------&amp;lt; br.com.food:food &amp;gt;--------------------------&lt;br&gt;&lt;br&gt;
[INFO] Building food 1.0-SNAPSHOT&lt;br&gt;&lt;br&gt;
[INFO] --------------------------------[ jar ]---------------------------------&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ food ---&lt;br&gt;&lt;br&gt;
[INFO] Using 'UTF-8' encoding to copy filtered resources.&lt;br&gt;&lt;br&gt;
[INFO] Copying 2 resources&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ food ---&lt;br&gt;&lt;br&gt;
[INFO] Changes detected - recompiling the module!&lt;br&gt;&lt;br&gt;
[INFO] Compiling 2 source files to /home/marcus/Estudo/Quarkus/food/target/classes&lt;br&gt;&lt;br&gt;
[INFO]&lt;br&gt;&lt;br&gt;
[INFO] --- quarkus-maven-plugin:1.0.1.Final:dev (default-cli) @ food ---&lt;br&gt;&lt;br&gt;
Listening for transport dt_socket at address: 5005&lt;br&gt;&lt;br&gt;
2019-12-12 16:44:24,885 WARN  &lt;a href="https://dev.tomain"&gt;org.hib.eng.jdb.spi.SqlExceptionHelper&lt;/a&gt; SQL Warning Code: 0, SQLState: 00000&lt;br&gt;&lt;br&gt;
2019-12-12 16:44:24,891 WARN  &lt;a href="https://dev.tomain"&gt;org.hib.eng.jdb.spi.SqlExceptionHelper&lt;/a&gt; table "food" does not exist, skipping&lt;br&gt;&lt;br&gt;
2019-12-12 16:44:25,135 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Quarkus 1.0.1.Final started in 1.715s. Listening on: &lt;a href="http://0.0.0.0:8080" rel="noopener noreferrer"&gt;http://0.0.0.0:8080&lt;/a&gt;&lt;br&gt;&lt;br&gt;
2019-12-12 16:44:25,136 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Profile dev activated. Live Coding activated.&lt;br&gt;&lt;br&gt;
2019-12-12 16:44:25,136 INFO  &lt;a href="https://dev.tomain"&gt;io.quarkus&lt;/a&gt; Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, jdbc-postgresql, narayana-jta, resteasy]&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Obversação 1: Assim que finalizar a execução, percebemos que a tabela Food foi criada no banco de dados.&lt;/p&gt;

&lt;p&gt;Obvervação 2: Caso não queira o comportamento de criação automatica do banco de dados, basta comentar ou remover a linha: “quarkus.hibernate-orm.database.generation = drop-and-create”, de dentro do arquivo do application.properties.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Verificando se a tabela foi criada no Banco de Dados.
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AUzES496LwJbjGDJF" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AUzES496LwJbjGDJF"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Espero que esteja gostando desse artigo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Implementando uma simples classe de negócio
&lt;/h3&gt;

&lt;p&gt;Crie uma classe chamada de FoodController.java, dentro da pasta br.com.food.controller. Essa classe será responsável por conter uma regra de negócio simples.&lt;/p&gt;

&lt;p&gt;@ApplicationScoped&lt;br&gt;&lt;br&gt;
public class FoodController {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public Food update(Long id, Food food) {  
    Food foodEntity = Food.findById(id);

    if (foodEntity == null) {  
        throw new WebApplicationException("Food with id of " + id + " does not exist.", Response.Status.NOT_FOUND);  
    }

    foodEntity.setName(food.getName());  
    foodEntity.setCalories(food.getCalories());

    return foodEntity;  
}

/**  
 * This method is main purpose to show simple "Business" example  
 * @param food  
 * @return  
 */  
public boolean isFoodNameIsNotEmpty(Food food) {  
    return food.getName().isEmpty();  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;br&gt;&lt;br&gt;
}&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementação do FoodResouce.java
&lt;/h3&gt;

&lt;p&gt;A classe FoodResource, é responsável por expor a API com os métodos para cadastro, edição, remoção e lista de todos os alimentos cadastrados.&lt;/p&gt;

&lt;h1&gt;
  
  
  FoodResource.java
&lt;/h1&gt;

&lt;p&gt;package br.com.food.resource;&lt;br&gt;&lt;br&gt;
// OMITIDO&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/path"&gt;@path&lt;/a&gt;("/food")&lt;br&gt;&lt;br&gt;
@Produces(MediaType.APPLICATION_JSON)&lt;br&gt;&lt;br&gt;
@Consumes(MediaType.APPLICATION_JSON)&lt;br&gt;&lt;br&gt;
public class FoodResource {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Inject  
private FoodController foodController;

@GET  
public List&amp;lt;Food&amp;gt; findAll() {  
    return Food.listAll();  
}

@POST  
@Transactional  
public Response create(Food food) {  
    Food.persist(food);  
    return Response.ok(food).status(201).build();  
}

@PUT  
@Path("{id}")  
@Transactional  
public Response update(@PathParam("id") Long id, Food food) {

    if (foodController.isFoodNameIsNotEmpty(food)) {  
        return Response.ok("Food was not found").type(MediaType.APPLICATION_JSON_TYPE).build();  
    }

    Food foodEntity = foodController.update(id, food);

    return Response.ok(foodEntity).build();  
}

@DELETE  
@Path("{id}")  
@Transactional  
public Response delete(@PathParam("id") Long id) {  
    Food foodEntity = Food.findById(id);

    if (foodEntity == null) {  
        throw new WebApplicationException("Food with id " + id + " does not exist.", Response.Status.NOT_FOUND);  
    }

    foodEntity.delete();  
    return Response.status(204).build();  
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Observação: Reparem que é possível efetuar uma operação de persistência tanto na camada de Resource(API), quanto na classe de negócio ou até mesmo em uma classe Data Access Object — &lt;a href="https://pt.stackoverflow.com/questions/113840/como-funciona-o-padr%C3%A3o-dao" rel="noopener noreferrer"&gt;DAO&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Testando a API através do Postman
&lt;/h3&gt;

&lt;p&gt;Abra o Postman, selecione o método POST e digite a URL: &lt;a href="http://localhost:8080/food." rel="noopener noreferrer"&gt;http://localhost:8080/food.&lt;/a&gt; Adicionalmente, adicione um Body com os dados conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Aprt7lK8MsX4qWDqk" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Aprt7lK8MsX4qWDqk"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cadastrando outro alimento no Postman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Adma82JkvOgM9OlDC" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Adma82JkvOgM9OlDC"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listando todas os alimentos no Postman
&lt;/h3&gt;

&lt;p&gt;No Postman, crie uma outra requisição do tipo GET e digite a url: &lt;a href="http://localhost:8080/food," rel="noopener noreferrer"&gt;http://localhost:8080/food,&lt;/a&gt; o resultado será a lista de todos os alimentos cadastrados no banco de dados, conforme a imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Al0s5y9Js6drFZClc" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Al0s5y9Js6drFZClc"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Postman — Atualizando um objeto
&lt;/h3&gt;

&lt;p&gt;Para atualizar a descrição e/ou a caloria de um alimento, basta criar uma nova requisição do tipo PUT, adicionar no final da URL o código (ID) do alimento que modificado. Não esqueça de preencher o body, que contém o JSON do objeto alterado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AQPuv-9ZGzJOg-ckj" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AQPuv-9ZGzJOg-ckj"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verificando os registros no Banco de Dados
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AyyJWkqJsQ6h2XEAr" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AyyJWkqJsQ6h2XEAr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Removendo um alimento através do Postman
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AMwVDoLzoiRCtR8g0" 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%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2AMwVDoLzoiRCtR8g0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listando todos os alimentos através do Postman
&lt;/h3&gt;

&lt;p&gt;No último teste, será listado todos os alimentos que estão cadastrados no banco de dados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Esse é o meu primeiro artigo e espero que vocês tenham gostado, sinta-se à vontade para sugerir, criticar ou elogiar. Um grande abraço e até a próxima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Código-Fonte
&lt;/h3&gt;

&lt;p&gt;O código-fonte está disponível no endereço: &lt;a href="https://github.com/marcuspaulo/quarkus-food" rel="noopener noreferrer"&gt;https://github.com/marcuspaulo/quarkus-food&lt;/a&gt;&lt;/p&gt;

</description>
      <category>quarkus</category>
      <category>developer</category>
      <category>hibernate</category>
      <category>java</category>
    </item>
  </channel>
</rss>
