Trabalhando com JPA,Quarkus,Panache e bolo de chocolate

Segundo centro de pesquisas de números tirados da minha cabeça,JPAéuma das specificaçes Java mais utilizadas no mundo.Jáexistemuitomuitomuito、conteúdo mesmo(é sério).
다도스 은행의 비행 노선에서 준비 작업이 이미 끝났다.Enquanto escrevia,notei que ele ficou bem longo porque tava trazendo vários conceitos de JPA e queria garantir que você,nobre leitor,soubese do que eu estou falando.
Então a gente vai deixar tudo bem bonitinho aqui para que o próximo post seja topzeira de entender.

팔레모스?


Vamos evoluir o código da nossa para salvar as informaçes num banco de dados.Depois,vamos usar o OpenAPI para validar o que fizemos.

Éhora da aão


bolos의 código da fábrica Partido do código da fábrica de bolos.Vamos adicionar as extensões do JPA e o conector com PostgreSQL.Vamos usar o seguinte comando.
./mvnw quarkus:add-extension -Dextensions="quarkus-hibernate-orm-panache,quarkus-jdbc-postgresql"
Depois, vamos colocar를 설정으로 하고 nosso arquivo 응용 프로그램이 없습니다.속성Esse arquivo vai ficar com a seguinte cara:
quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = Sarah
quarkus.datasource.password = Connor
quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/skynet

quarkus.hibernate-orm.database.generation = update
Com isso,nós informamos ao Quarkus que vamos usar um banco de dados PostgreSQL,que o usuárioéSarah,a senhaéConnor,o banco se chama skynet e estárodando na máquina local na porta 5432.Também,informamos ao JPA que queremos que ele gere as tabelas do banco de dados baseado nas nossas entidades.
E por falar em entidade,vamos alterar a classe Bolo para que ela vire uma entidade persistível.Para isso,ésótrocar o código do arquivo Bolo.자바포에스다키.
package com;

import javax.persistence.Entity;

import io.quarkus.hibernate.orm.panache.PanacheEntity;

@Entity
public class Bolo extends PanacheEntity {
  public String nome;
  public String descricao;

  public Bolo() {
  }

  public Bolo(String nome, String descricao) {
    this.nome = nome;
    this.descricao = descricao;
  }

}
Bem mais simples que a versão front,neah?!Extendendo a classe PanacheEntity,o Quarkus jáfaz um monte de coisa:
  • Permite utilizar o padrãoActive Record;
  • Todos os campos p úblicos s ão tratados como colunas no banco de dados(mais ou menos como se tives a anota ão@ 칼럼);
  • entidade herdaráum id do tipo long(chamado id)auto gerado;
  • 편찬자의 리듬, 그들은 모든 사람의 수용자와 수용자이다.
  • Em tempo de COMPILLAço,o acesso direto aos atributos da entidade serão transformados Em chamadas getters e setters(se vocêduvida,crie um setter e coloque um System.out para ver a magia acontecer).
  • Nós adicionamos a anotaão@Entity para que o JPA saiba que essaéuma das nossas entidades.
    Também vamos precisamos alterar a nossa classe Bolore Source.Ela ficarácom a seguinte cara.
    package com;
    
    import java.util.List;
    
    import javax.annotation.PostConstruct;
    import javax.transaction.Transactional;
    import javax.ws.rs.Consumes;
    import javax.ws.rs.DELETE;
    import javax.ws.rs.GET;
    import javax.ws.rs.POST;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    import org.eclipse.microprofile.openapi.annotations.Operation;
    import org.eclipse.microprofile.openapi.annotations.enums.SchemaType;
    import org.eclipse.microprofile.openapi.annotations.media.Content;
    import org.eclipse.microprofile.openapi.annotations.media.Schema;
    import org.eclipse.microprofile.openapi.annotations.parameters.Parameter;
    import org.eclipse.microprofile.openapi.annotations.parameters.RequestBody;
    import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
    
    @Path("/bolo")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public class BoloResource {
    
      @PostConstruct
      @Transactional
      public void init() {
        new Bolo("Chocolate", "Melhor bolo do mundo").persist();;
        new Bolo("Sensação", "Chocolate com morango").persist();;
      }
    
    
      @GET
      @Operation(summary = "Retorna todos os bolos cadastrados")
      @APIResponse(responseCode = "200", //
          content = @Content(//
              mediaType = MediaType.APPLICATION_JSON, //
              schema = @Schema(//
                  implementation = Bolo.class, //
                  type = SchemaType.ARRAY)))
      public List<Bolo> list() {
        return Bolo.listAll();
      }
    
      @Operation(summary = "Cadastra um bolo")
      @APIResponse(responseCode = "200", //
          description = "Retorna todos os todos os bolos cadastrados, incluindo o novo bolo", //
          content = @Content(//
              mediaType = MediaType.APPLICATION_JSON, //
              schema = @Schema(//
                  implementation = Bolo.class, //
                  type = SchemaType.ARRAY)))
      @POST
      @Transactional
      public List<Bolo> add(//
          @RequestBody(required = true, //
              content = @Content(//
                  mediaType = MediaType.APPLICATION_JSON, //
                  schema = @Schema(//
                      implementation = Bolo.class))) Bolo bolo) {
        bolo.id = null; //coisa feia, não façam isso em casa
        bolo.persist();
        return list();
      }
    
      @Operation(summary = "Deleta um bolo pelo nome do bolo")
      @APIResponse(responseCode = "200", //
          description = "Todos os bolos cadastrados menos aquele retirado", //
          content = @Content(mediaType = MediaType.APPLICATION_JSON, //
              schema = @Schema(implementation = Bolo.class, //
                  type = SchemaType.ARRAY)))
      @DELETE
      @Path("/{nome}")
      @Transactional
      public List<Bolo> delete(//
          @Parameter(description = "Nome do bolo a ser retirado", required = true) //
          @PathParam("nome") String nome) {
        Bolo.delete("nome", nome);
        return Bolo.listAll();
      }
    }
    
    Aqui,nós tiramos o método construtor e criamos um método init()que com a anotaão PostConstruct.Essa anotaço garante que o método seja rodado logo após a construço do nosso BoloResource.오로달 에세 메토도, nós vamos 지적부 os dois bolos iniciais.

    Os métodos foram reescritos para usarem o active record e as operaçes que alteram dados no banco de dados receberam a anotaç[email protected] anotaçoénecesária para que a operaço seja feita em uma transaço.
    Sófalta subir o banco de dados e testar.Isso seráfeito através do seguinte comandodockerque criarum container com as nossas credenciais:
    docker run -e POSTGRES_USER=Sarah -e POSTGRES_PASSWORD=Connor -e POSTGRES_DB=skynet -p 5432:5432 postgres:12-alpine
    
    Para testar,basta rodar o seguinte comando
    mvn quarkus:dev
    
    봐봐.O serviçO estápronto para b̶r̶i̶n̶c̶a̶r̶m̶O̶s̶testarmos através da url localhost:8080/bolo.Com a grande vantagem de queépossível baixar e subir o servidor que os dados estarão salvos.E、 se nós quisermos recomeçar tudo zero,ésóparar o container docker que nós criamos.

    고려 요소


    아티고 나스쿠 마이스 다 네체스데드 가란티르 크 이스타토도 몬도 프랑도 메스마 린가.
    Nos meus projetos,não utilizo o ActiveRecord porque tenho preconceptito cométodos estáticos,mas reconcheço que ele tem suas vantagens em projetos BEEEEEEM pequenos.
    Um ponto importante,esse códigoé UM exemplo e que nós queremos apenas 지적부 Um Bolo.Por isso que nós colocamos null no id.Num mundo real,não devemos ir expondo as nossas entidades do sistema,mas usarmos DTOs para isso.
    Estou ciente de que existe um bug de que cada vez que a gente sobe a aplicaão,ele vai cadestrando novos bolos.Isso será resolvido no próximo 강좌.Agora,que Agora venha o tutorial sobre flyway.
    아, e o c ó digo de hoje pode ser encontrado no meugithub.

    좋은 웹페이지 즐겨찾기