{"id":24033326,"url":"https://github.com/augustomello09/modelo-conceitual","last_synced_at":"2026-04-30T12:32:08.978Z","repository":{"id":62796869,"uuid":"561976637","full_name":"AugustoMello09/Modelo-conceitual","owner":"AugustoMello09","description":"Estudo sobre  a implementação do modelo conceitual. (Curso Projeto full stack completo! Java Spring Boot no back end e Ionic no front end do Prof. Dr. Nelio Alves)Seção 1:  Implementação do modelo conceitual.","archived":false,"fork":false,"pushed_at":"2023-01-10T12:30:20.000Z","size":147,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-26T04:31:29.868Z","etag":null,"topics":["h2-database","java","modelo-conceitual","postman","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AugustoMello09.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-11-05T00:00:16.000Z","updated_at":"2022-11-09T19:35:41.000Z","dependencies_parsed_at":"2023-02-08T18:45:41.580Z","dependency_job_id":null,"html_url":"https://github.com/AugustoMello09/Modelo-conceitual","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AugustoMello09/Modelo-conceitual","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AugustoMello09%2FModelo-conceitual","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AugustoMello09%2FModelo-conceitual/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AugustoMello09%2FModelo-conceitual/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AugustoMello09%2FModelo-conceitual/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AugustoMello09","download_url":"https://codeload.github.com/AugustoMello09/Modelo-conceitual/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AugustoMello09%2FModelo-conceitual/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32465009,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"online","status_checked_at":"2026-04-30T02:00:05.929Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["h2-database","java","modelo-conceitual","postman","springboot"],"created_at":"2025-01-08T18:15:47.047Z","updated_at":"2026-04-30T12:32:08.924Z","avatar_url":"https://github.com/AugustoMello09.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Objetivo geral:\n\n- Leitura e entendimento do diagrama de classes \n- Leitura e entendimento do diagrama de objetos \n- Associações \n  Um para muitos / muitos para um \n, Um para um \n, Muitos para muitos comum \ne Muitos para muitos com classe de associação \n- Bidirecionais / direcionadas \n- Conceito independente / dependente \n- Classe de associação \n- Herança \n- Enumerações \n- Atributos Embedded (ItemPedidoPK) \n- Coleções ElementCollection (telefones de um cliente)\n\n# Modelo Conceitual\n\n###  Estrutura de camadas do sistema\n\n![mvc](https://user-images.githubusercontent.com/101072311/200664937-257765c1-4c76-4828-b0ee-fb01913388d5.png)\n\n### Objetivos específicos: \n1) Fazer uma implementação padrão do seguinte modelo conceitual:\n\n![modeloconceitual](https://user-images.githubusercontent.com/101072311/200668188-8fd77ed7-c684-4bf3-9ac5-654e19a3d36c.png)\n\n### Objetivos (continuação): \n2) Criar a seguinte instância do modelo conceitual:\n\n![Screenshot_1](https://user-images.githubusercontent.com/101072311/200668174-317f8f2a-6529-4962-bf85-b5ac9cf1bbba.png)\n\n#### Anotações de estudo\n\n- Na camada de controladores REST vai ficar nosso Resource.\n- Por padrão na hora de trabalhar na criação das classes de entidade colocar no pacote domain.\n- Service oferece operações e consulta para os controladores REST.\n- A camada de serviço não tem contato com nenhuma tecnologia específicas(Não tem contato com o Banco, REST e com tela).\n- A camada de serviço vai utilizar a camada de acesso a dados para realizar regras de negócio que por ventura ainda não foi implantado na camada domínio.\n- A camada de acesso a dados(Repository) tem o papel de conversar com o banco de dados, é nela que vamos realizar as operações de salvar, alterar, excluir e consultar(Tudo que envolva SQL).\n- Como não é uma boa prática colocar blocos de try catch no controladores REST, vamos fazer um Handler que é um objeto especial que vai interceptar e vai lançar a resposta Http correta.\n- Em teste realizados, o uso de @JsonManagedReference/@JsonBackRefence apresentou alguns problemas com o\nenvio de dados Json em requisições .\nAssim, ao invés de usar @JsonManagedReference/@JsonBackRefence, vamos simplesmente utilizar o\n@JsonIgnore no lado da associação que não deve ser serializada.\n\n### Criando a classe de controle REST\ncomeçando pela categoria.\n~~~JAVA\n@RestController\n@RequestMapping(value = \"/categorias\")\npublic class CategoriaResource {\n\n\n  @RequestMapping(method = RequestMothod.GET)\n  public String listar(){\n    return \"REST está funcionando\";\n  }\n\n}\n~~~\n#### Criando nossa entidade Categoria\n Criando nossa primeira entidade e colocando no pacote domain.\n Obs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\npublic class Categoria implements Serializable{\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate Integer id;\n\tprivate String nome;\n}\n~~~\n\n#### Fazendo atualização na classe de controle REST.\n\nFazendo atualização no método de listar.\n\n~~~JAVA\n  @RequestMapping(method = RequestMothod.GET)\n  public List\u003cCategoria\u003e listar(){\n    Categoria cat1 = new Categoria(1, \"Informática\");\n    Categoria cat2 = new Categoria(2,\"Escritório\");\n\n    List\u003cCategoria\u003e lista = new ArrayList\u003c\u003e();\n    lista.add(cat1);\n    lista.add(cat2);\n\n    return lista;\n  }\n~~~\n\n- Testando no navegador e no Postman se está funcioando a requisição.\n\n![nav](https://user-images.githubusercontent.com/101072311/200009942-467746d6-1aa5-4362-af0c-e99c9dcff392.png)\n\n![postam](https://user-images.githubusercontent.com/101072311/200009971-5fd0dae5-03fc-470b-bee9-4e656ed3e7b6.png)\n\n#### Gerando tabela  Categoria automaticamente no Banco de teste H2\ncolocando as Anotações na classe Categoria para gerar no Banco\n~~~JAVA\n@Entity\npublic class Categoria implements Serializable{\n\tprivate static final long serialVersionUID = 1L;\n\n  @Id\n  @GeneratedValue (strategy = GenerationType.IDENTITY)\n  private Integer id;\n\n  private String nome;\n}  \n~~~\n\n![h2](https://user-images.githubusercontent.com/101072311/200090910-de65e94b-9e5d-4f87-9817-aa2ac8c6b2a0.png)\n\n#### Criando a camada de acesso a dados(Repository)\nCriando um Repository para acessar as categorias\n~~~JAVA\n@Repository\npublic interface CategoriaRepository extends JpaRepository\u003cCategoria, Integer\u003e {\n}\n~~~\n\n#### Criando a camada Service\nA camada Service vai servir de operações e consultas para Categoria e implantado um serviço que busca uma Categoria.\n~~~JAVA\n@Service\npublic class CategoriaService {\n\n\t@Autowired/*A dependência e automaticamente instanciada pelo Spring */\n\tprivate CategoriaRepository repo;\n\n\tpublic Categoria find(Integer id) {\n\t\tOptional\u003cCategoria\u003e obj = repo.findById(id);\n\t\treturn obj.orElse(null);\n\t}\n\n}\n~~~\n#### Atualizando os controladores REST\nAtualizando para os controladores serem capazes de buscar uma Categoria.\n~~~JAVA\n@RestController\n@RequestMapping(value = \"/categorias\")\npublic class CategoriaResource {\n\n\t@Autowired\n\tprivate CategoriaService service;\n\n\t@RequestMapping(value =\"/{id}\", method = RequestMethod.GET)\n\tpublic ResponseEntity\u003c?\u003e find(@PathVariable Integer id) {\n\t\tCategoria obj = service.find(id);\n\t\treturn ResponseEntity.ok().body(obj);\n\n\t}\n}\n~~~\nIncluindo manualmente no banco teste H2\n\n~~~SQL\nINSERT INTO CATEGORIA(NOME) VALUES ('Informática');\nINSERT INTO CATEGORIA(NOME) VALUES ('Escritório');  \n\nSELECT * FROM CATEGORIA\n~~~\n\n![dbh2](https://user-images.githubusercontent.com/101072311/200130932-1932dccc-675e-401b-bdb8-2bd8572da296.png)\n\n- Testando a requisição no Postman.\n\n/categorias/1\n\n![cat1](https://user-images.githubusercontent.com/101072311/200131282-db0b348e-23c0-4695-9345-0c5360576505.png)\n\n/categorias/2\n\n![cat2](https://user-images.githubusercontent.com/101072311/200131281-8138f550-88a7-46fc-82c0-0f07956250c8.png)\n\n#### Instanciando CategoriaRepository\npara não ter o trabalho de instanciar manualmente os objetos  Categoria no banco de dados, vamos fazer isso automaticamente.\n~~~JAVA\n  @Autowired\n\tprivate CategoriaRepository categoriaRepository;\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(EstudomcApplication.class, args);\n\t}\n\n\t@Override\n\tpublic void run(String... args) throws Exception {\n\n\t\tCategoria cat1 = new Categoria(null, \"Informática\");\n\t\tCategoria cat2 = new Categoria(null, \"Escritório\");\n\n\t\tcategoriaRepository.saveAll(Arrays.asList(cat1, cat2));\n\n\n\t}\n~~~\n#### implementado a entidade Produto\nFazendo as associações entra elas e instanciar os objetos.\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Produto implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\t@GeneratedValue(strategy =GenerationType.IDENTITY)\n\tprivate Integer id;\n\n\tprivate String nome;\n\tprivate Double preco;\n\n\t@ManyToMany\n\t@JoinTable(name = \"PRODUTO_CATEGORIA\",\n\tjoinColumns = @JoinColumn(name= \"produto_id\"),\n\tinverseJoinColumns = @JoinColumn(name = \"categoria_id\"))\n\tprivate List\u003cCategoria\u003e categorias = new ArrayList\u003c\u003e();\n}\n~~~\n\n##### Criando ProdutoRepository\n\n~~~JAVA\n@Repository\npublic interface ProdutoRepository extends JpaRepository\u003cProduto, Integer\u003e {\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n  @Autowired\n\tprivate ProdutoRepository produtoRepository;\n\n  Produto p1 = new Produto(null, \"Computador\", 2000.00);\n\tProduto p2 = new Produto(null, \"Impressora\", 800.00);\n\tProduto p3 = new Produto(null, \"Mouse\", 80.00);\n\n\tcat1.getProdutos().addAll(Arrays.asList(p1, p2, p3));\n\tcat2.getProdutos().addAll(Arrays.asList(p2));\n\n\tp1.getCategorias().addAll(Arrays.asList(cat1));\n\tp2.getCategorias().addAll(Arrays.asList(cat1, cat2));\n\tp3.getCategorias().addAll(Arrays.asList(cat1));\n\n  categoriaRepository.saveAll(Arrays.asList(cat1, cat2));\n  produtoRepository.saveAll(Arrays.asList(p1, p2, p3));\n~~~\n\nTestando no H2 o relacionamento\n\n![select produtos](https://user-images.githubusercontent.com/101072311/200185181-79c68755-1f45-4b26-a216-a2b6f2e1321d.png)\n\n![categoria](https://user-images.githubusercontent.com/101072311/200185187-fb07e001-b18e-4c1d-98eb-8437dc78b8c4.png)\n\n\n#### Protegendo da referência cítrica no Json\n\n~~~JAVA\n@JsonManagedReference\n\t@ManyToMany(mappedBy = \"categorias\")\n\tprivate List\u003cProduto\u003e produtos  = new ArrayList\u003c\u003e();\n~~~\n\n~~~JAVA\n@JsonBackReference\n\t@ManyToMany\n\t@JoinTable(name = \"PRODUTO_CATEGORIA\",\n\tjoinColumns = @JoinColumn(name= \"produto_id\"),\n\tinverseJoinColumns = @JoinColumn(name = \"categoria_id\"))\n\tprivate List\u003cCategoria\u003e categorias = new ArrayList\u003c\u003e();\n~~~\n\n#### Corrigindo erro de busca vazia\nIncluindo um tratamento de Exceções, agora o método de serviço ele lança uma exceção caso o Id não exista.  \n\n![código que não existe](https://user-images.githubusercontent.com/101072311/200188736-8d520948-e24a-4fad-a516-121b7babf147.png)\n\n~~~JAVA\npublic Categoria find(Integer id) {\n\t\t Optional\u003cCategoria\u003e obj = repo.findById(id);\n\t\treturn obj.orElseThrow(() -\u003e new ObjectNotFoundException(\n\t\t \"Objeto não encontrado! Id: \" + id + \", Tipo: \" + Categoria.class.getName()));\n\t\t}\n~~~\n\n##### Criando um Hendler para lançar o erro\nComo não é uma boa prática colocar blocos de try catch no controladores REST, vamos fazer um Handler que é um objeto especial que vai interceptar e vai lançar a resposta Http correta.\n\n##### ResourceExceptionHandler\n\n~~~JAVA\n@ControllerAdvice\npublic class ResourceExceptionHandler  {\n\n  @ExceptionHandler(ObjectNotFoundException.class)\n  public ResponseEntity\u003cStandardError\u003e objectNotFound(ObjectNotFoundException e, HttpServletRequest request){\n\n\t\tStandardError err = new StandardError(HttpStatus.NOT_FOUND.value(), e.getMessage(), System.currentTimeMillis());\n\t\treturn ResponseEntity.status(HttpStatus.NOT_FOUND).body(err);\n\t}\n}\n~~~\n\n##### StandardError\n\n~~~JAVA\npublic class StandardError implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate Integer status;\n\tprivate String msg;\n\tprivate Long timeStamp;\n}\n~~~\n\n![erro](https://user-images.githubusercontent.com/101072311/200189837-876186dd-d0c2-4036-ae8b-39a59d7bd645.png)\n\n#### implementado a entidade Cidade\nCom o relacionamento de muitos para um.\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Cidade implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Integer id;\n\tprivate String nome;\n\n\t@ManyToOne\n\t@JoinColumn(name =\"estado_id\")\n\tprivate Estado estado;\n\n}\n~~~\n\n##### Criando CidadeRepository\n\n~~~JAVA\n@Repository\npublic interface CidadeRepository extends JpaRepository\u003cCidade, Integer\u003e {\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate CidadeRepository cidadeRepository;\n\nCidade c1 = new Cidade(null, \"Uberlândia\", est1);\nCidade c2 = new Cidade(null, \"São Paulo\", est2);\nCidade c3 = new Cidade(null, \"Campinas\", est2);\n\ncidadeRepository.saveAll(Arrays.asList(c1, c2, c3));\n~~~\n\n#### implementado a entidade Estado\nCom o relacionamento de um para muitos.\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Estado implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t\t@Id\n\t\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\t\tprivate Integer id;\n\n\t\tprivate String nome;\n\n\t\t@OneToMany(mappedBy = \"estado\")\n\t\tprivate List\u003cCidade\u003e cidade = new ArrayList\u003c\u003e();\n\n}\n~~~\n\n##### Criando EstadoRepository\n\n~~~JAVA\n@Repository\npublic interface EstadoRepository extends JpaRepository\u003cEstado, Integer\u003e {\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate EstadoRepository estadoRepository;\n\nEstado est1 = new Estado(null, \"Minas Gerais\");\nEstado est2 = new Estado(null, \"São Paulo\");\n\n// Adicionando cada cidade em seu estado\nest1.getCidade().addAll(Arrays.asList(c1));\nest2.getCidade().addAll(Arrays.asList(c2, c3));\n\nestadoRepository.saveAll(Arrays.asList(est1, est2));\n~~~\nTestando no banco teste H2\n\n![estado](https://user-images.githubusercontent.com/101072311/200338942-a7b48af5-7589-4e8e-853c-afa256bd9c21.png)\n\n![cidade](https://user-images.githubusercontent.com/101072311/200338953-16b9973c-adbb-40c5-81bf-ee3e88807b40.png)\n\n\n#### Criando um enumerado de TipoCliente\n\n~~~JAVA\npublic enum TipoCliente {\n\tPESSOAFISICA(1, \"Pessoa Física\"),\n\tPESSOAJURIDICA(2, \"Pessoa Jurídica\");\n\n\tprivate int cod;\n\tprivate String descricao;\n\n\tprivate TipoCliente(int cod, String descricao) {\n\t\tthis.cod = cod;\n\t\tthis.descricao = descricao;\n\t}\n\n\tpublic int getCod() {\n\t\treturn cod;\n\t}\n\n\tpublic String getDescricao() {\n\t\treturn descricao;\n\t}\n\n\tpublic static TipoCliente toEnum(Integer cod) {\n\n\t\tif (cod == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (TipoCliente x : TipoCliente.values()) {\n\t\t\tif (cod.equals(x.getCod())) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\n\t\tthrow new IllegalArgumentException(\"Id inválido: \" + cod);\n\n\t}\n\n}\n~~~\n#### implementado a entidade Cliente\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Cliente implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Integer id;\n\n\tprivate String nome;\n\tprivate String email;\n\tprivate String cpfOuCnpj;\n\tprivate Integer tipo;\n\n\t@OneToMany(mappedBy = \"cliente\")\n\tprivate List\u003cEndereco\u003e enderecos = new ArrayList\u003c\u003e();\n\n\t@ElementCollection\n\t@CollectionTable(name =\"TELEFONE\")\n\tprivate Set\u003cString\u003e telefones = new HashSet\u003c\u003e();\n}\n~~~\n\n##### Criando ClienteRepository\n\n~~~JAVA\n@Repository\npublic interface ClienteRepository extends JpaRepository\u003cCliente, Integer\u003e {\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate ClienteRepository clienteRepository;\n\nCliente cli1 = new Cliente(null, \"Maria Silva\", \"maria@gmail.com\", \"36378912377\", TipoCliente.PESSOAFISICA);\n\n// Salvando os dois telefones\ncli1.getTelefones().addAll(Arrays.asList(\"27363323\", \"93838393\"));\n\n//Salvando os endereços\ncli1.getEnderecos().addAll(Arrays.asList(e1, e2));\n\nclienteRepository.saveAll(Arrays.asList(cli1));\n~~~\n\n#### implementado a entidade Endereco\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Endereco implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Integer id;\n\n\tprivate String logradouro;\n\tprivate String numero;\n\tprivate String complemento;\n\tprivate String bairro;\n\tprivate String cep;\n\n\t@ManyToOne\n\t@JoinColumn (name =\"cliente_id\")\n\tprivate Cliente cliente;\n\n\t@ManyToOne\n\t@JoinColumn (name =\"cidade_id\")\n\tprivate Cidade cidade;\n\n}\n~~~\n\n##### Criando ClienteRepository\n\n~~~JAVA\n@Repository\npublic interface EnderocoRepository extends JpaRepository\u003cEndereco, Integer\u003e {\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate EnderecoRepository enderecoRepository;\n\nEndereco e1 = new Endereco(null, \"Rua Flores\", \"360\", \"Apto 303\", \"Jardim\", \"38220834\", cli1, c1);\nEndereco e2 = new Endereco(null, \"Avenida Matos\", \"105\", \"Sala 800\", \"Centro\", \"38777012\", cli1, c2);\n\nenderecoRepository.saveAll(Arrays.asList(e1, e2));\n~~~\n\n![maria](https://user-images.githubusercontent.com/101072311/200338921-69215553-4307-42ef-8611-4b7064715c28.png)\n\n![teleclient1](https://user-images.githubusercontent.com/101072311/200338897-eea5a6d5-71a2-4ffa-870a-a387da85f7c0.png)\n\n![endereco](https://user-images.githubusercontent.com/101072311/200338932-bb5c7fe7-2b6e-4a02-bafb-50ba7cb45cd8.png)\n\n#### Criando o Endpoint Clientes/id\n\n~~~JAVA\n@RestController\n@RequestMapping(value = \"/clientes\")\npublic class ClienteResource {\n\n\t@Autowired\n\tprivate ClienteService service;\n\n\t@RequestMapping(value =\"/{id}\", method = RequestMethod.GET)\n\tpublic ResponseEntity\u003c?\u003e find(@PathVariable Integer id) {\n\t\tCliente obj = service.find(id);\n\t\treturn ResponseEntity.ok().body(obj);\n\n\t}\n}\n~~~\n\n#### Protegendo da referência cítrica no Json\n\nCliente\n~~~JAVA\n@JsonManagedReference\n\t@OneToMany(mappedBy = \"cliente\")\n\tprivate List\u003cEndereco\u003e enderecos = new ArrayList\u003c\u003e();\n~~~\nEndereço\n~~~JAVA\n@JsonBackReference\n\t@ManyToOne\n\t@JoinColumn (name =\"cliente_id\")\n\tprivate Cliente cliente;\n~~~\nCidade\n~~~JAVA\n@JsonManagedReference\n\t@ManyToOne\n\t@JoinColumn(name =\"estado_id\")\n\tprivate Estado estado;\n~~~\nEstado\n~~~JAVA\n@JsonBackReference\n\t\t@OneToMany(mappedBy = \"estado\")\n\t\tprivate List\u003cCidade\u003e cidade = new ArrayList\u003c\u003e();\n~~~\n\n#### Criando ClienteService\n\n~~~JAVA\n@Service\npublic class ClienteService {\n\n\t@Autowired\n\tprivate ClienteRepository repo;\n\n\tpublic Cliente find(Integer id) {\n\t\t Optional\u003cCliente\u003e obj = repo.findById(id);\n\t\treturn obj.orElseThrow(() -\u003e new ObjectNotFoundException(\n\t\t \"Objeto não encontrado! Id: \" + id + \", Tipo: \" + Cliente.class.getName()));\n\t\t}\n\n}\n~~~\n\nTestando o Endpoint no Postman (clientes/{id})\n\n![testeEndpoint](https://user-images.githubusercontent.com/101072311/200357689-a0c8c2a7-08b7-430d-b2cf-606e5f0035ae.png)\n\n![terminotest1](https://user-images.githubusercontent.com/101072311/200357704-b7b0d860-dac2-436b-bf61-0ad53b5854d7.png)\n\n#### Criando a entidade Pedidos\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class Pedido implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\tprivate Integer id;\n\tprivate Date instante;\n\n\t@OneToOne(cascade=CascadeType.ALL, mappedBy =\"pedido\")\n\tprivate Pagamento pagamento;\n\n\t@ManyToOne\n\t@JoinColumn(name=\"cliente_id\")\n\tprivate Cliente cliente;\n\n\t@ManyToOne\n\t@JoinColumn(name=\"endereco_de_entrega_id\")\n\tprivate Endereco enderecoDeEntrega;\n}  \n~~~\n\n#### Criando a classe Pagamento\n\n~~~JAVA\n@Entity\n@Inheritance(strategy = InheritanceType.JOINED)\npublic abstract class Pagamento implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Id\n\tprivate Integer id;\n\tprivate Integer estado;\n\n\t@OneToOne\n\t@JoinColumn(name =\"pedido_id\")\n\t@MapsId\n\tprivate Pedido pedido;\n}  \n~~~\n#### Criando um enumerado de EstadoPagamento\n\n~~~JAVA\npublic enum EstadoPagamento {\n\tPENDENTE(1, \"Pendente\"),\n\tQUITADO(2, \"Quitado\"),\n\tCANCELADO(3, \"Cancelado\");\n\n\tprivate int cod;\n\tprivate String descricao;\n\n\tprivate EstadoPagamento(int cod, String descricao) {\n\t\tthis.cod = cod;\n\t\tthis.descricao = descricao;\n\t}\n\n\tpublic int getCod() {\n\t\treturn cod;\n\t}\n\n\tpublic String getDescricao() {\n\t\treturn descricao;\n\t}\n\n\tpublic static EstadoPagamento toEnum(Integer cod) {\n\n\t\tif (cod == null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (EstadoPagamento x : EstadoPagamento.values()) {\n\t\t\tif (cod.equals(x.getCod())) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\n\t\tthrow new IllegalArgumentException(\"Id inválido: \" + cod);\n\n\t}\n\n}\n~~~\n\n#### Criando as SubClasses de pagamento\n\n##### Pagamento com Boleto\n~~~JAVA\n@Entity\npublic class PagamentoComBoleto  extends Pagamento{\n\n\tprivate static final long serialVersionUID = 1L;\n\tprivate Date dataVencimento;\n\tprivate Date dataPagamento;\n}\n~~~\n##### Pagamento com Cartão\n~~~JAVA\n@Entity\npublic class PagamentoComCartao  extends Pagamento {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\tprivate Integer numeroDeParcelas;\n}\n~~~\n\n#### mapeamento OneToOne nos Pedidos\n~~~JAVA\n@OneToOne\n\t@JoinColumn(name =\"pedido_id\")\n\t@MapsId\n\tprivate Pedido pedido;\n\n  @OneToOne(cascade=CascadeType.ALL, mappedBy =\"pedido\")\n\tprivate Pagamento pagamento;\n~~~\n\n##### Criando PagamentoRepository\n\n~~~JAVA\n@Repository\npublic interface PagamentoRepository extends JpaRepository\u003cPagamento, Integer\u003e {\t\t\n}\n~~~\n\n##### Criando PedidoRepository\n\n~~~JAVA\n@Repository\npublic interface PedidoRepository extends JpaRepository\u003cPedido, Integer\u003e {\t\t\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate PagamentoRepository pagamentoRepository;\n\n@Autowired\nprivate PedidoRepository pedidoRepository;\n\nSimpleDateFormat sdf = new SimpleDateFormat(\"dd/MM/yyyy HH:mm\");\n\nPedido ped1 = new Pedido(null, sdf.parse(\"30/09/2017 10:32\"), cli1, e1);\nPedido ped2 = new Pedido(null, sdf.parse(\"10/10/2017 19:35\"), cli1, e2);\n\nPagamento pagto1 = new PagamentoComCartao(null, EstadoPagamento.QUITADO, ped1, 6);\nped1.setPagamento(pagto1);\n\nPagamento pagto2 = new PagamentoComBoleto(null, EstadoPagamento.PENDENTE, ped2, sdf.parse(\"20/10/2017 00:00\"),null);\nped2.setPagamento(pagto2);\n\ncli1.getPedidos().addAll(Arrays.asList(ped1, ped2));\n\npedidoRepository.saveAll(Arrays.asList(ped1, ped2));\npagamentoRepository.saveAll(Arrays.asList(pagto1, pagto2));\n~~~\n\nTestando no bando de dados H2\n\n![pagamento](https://user-images.githubusercontent.com/101072311/200578236-5bb1a032-9003-4660-ac8b-401713d4e2be.png)\n\n![pagamentoboleto](https://user-images.githubusercontent.com/101072311/200578251-0d75b6f8-b35c-47eb-9148-4a7550327ee7.png)\n\n![pagamentoCartão](https://user-images.githubusercontent.com/101072311/200578263-ce479eaa-9df7-477e-be7f-cb04478de2ec.png)\n\n![pedido](https://user-images.githubusercontent.com/101072311/200578271-367c4604-7792-4058-9535-90a49a2fcc0c.png)\n\n\n#### Entidade ItemPedido\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Entity\npublic class ItemPedido implements Serializable {\n\tprivate static final long serialVersionUID = 1L;\n\n\t@EmbeddedId\n\tprivate ItemPedidoPK id = new ItemPedidoPK();\n\n\tprivate Double desconto;\n\tprivate Integer quantida;\n\tprivate Double preco;\n}  \n~~~\n\n##### Classe ItemPedidoPK\nObs:Nela também acompanha Construtores, Getters, Setters e hashCode, mas não foi colocado na parte da documentação para não atrapalhar a visualização.\n~~~JAVA\n@Embeddable\npublic class ItemPedidoPK implements Serializable {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t@ManyToOne\n\t@JoinColumn(name=\"pedido_id\")\n\tprivate Pedido pedido;\n\n\t@ManyToOne\n\t@JoinColumn(name =\"produto_id\")\n\tprivate Produto produto;\n}\n~~~\n\n##### Criando ItemPedidoRepository\n\n~~~JAVA\n@Repository\npublic interface PedidoRepository extends JpaRepository\u003cItemPedido, Integer\u003e {\t\t\n}\n~~~\n\n##### Instanciando os objetos e Repository na classe de execução.\n\n~~~JAVA\n@Autowired\nprivate ItemPedidoRepository itemPedidoRepository;\n\nItemPedido ip1 = new ItemPedido(ped1, p1, 0.00, 1, 2000.00);\nItemPedido ip2 = new ItemPedido(ped1, p3, 0.00, 2, 80.00);\nItemPedido ip3 = new ItemPedido(ped2, p2, 100.00, 1, 800.00);\n\nped1.getItens().addAll(Arrays.asList(ip1, ip2));\nped2.getItens().addAll(Arrays.asList(ip3));\n\np1.getItens().addAll(Arrays.asList(ip1));\np2.getItens().addAll(Arrays.asList(ip3));\np3.getItens().addAll(Arrays.asList(ip2));\n\nitemPedidoRepository.saveAll(Arrays.asList(ip1, ip2, ip3));\n~~~\n\nTestando no bando de dados H2\n\n![itempedido](https://user-images.githubusercontent.com/101072311/200649418-e985597e-2cb0-4553-985c-c5eac39be3e3.png)\n\n#### Criando o Endpoint pedidos/id\n\n~~~JAVA\n@RestController\n@RequestMapping(value = \"/pedidos\")\npublic class PedidoResource {\n\n\t@Autowired\n\tprivate PedidoService service;\n\n\t@RequestMapping(value =\"/{id}\", method = RequestMethod.GET)\n\tpublic ResponseEntity\u003c?\u003e find(@PathVariable Integer id) {\n\t\tPedido obj = service.find(id);\n\t\treturn ResponseEntity.ok().body(obj);\n\n\t}\n}\n~~~\n#### Criando PedidoService\n\n~~~JAVA\n@Service\npublic class PedidoService {\n\n\t@Autowired\n\tprivate PedidoRepository repo;\n\n\tpublic Pedido find(Integer id) {\n\t\t Optional\u003cPedido\u003e obj = repo.findById(id);\n\t\treturn obj.orElseThrow(() -\u003e new ObjectNotFoundException(\n\t\t \"Objeto não encontrado! Id: \" + id + \", Tipo: \" + Pedido.class.getName()));\n\t\t}\n\n}\n~~~\n\nTestando o Endpoint no Postman (pedidos/{id})\n\n\n![pedidos1](https://user-images.githubusercontent.com/101072311/200660612-f423bd48-7cc9-4a41-adfd-7a372a7ddadf.png)\n\n![pedidos2](https://user-images.githubusercontent.com/101072311/200660618-23a6b3da-a574-4a3a-b281-0d887480dd6f.png)\n\n![pediso3](https://user-images.githubusercontent.com/101072311/200660625-6727079b-a21b-4205-bebd-10619bbad8bd.png)\n\n![pedidos4](https://user-images.githubusercontent.com/101072311/200660630-69bbd2f1-9239-4082-b785-6550aef8ef2b.png)\n\n### Atualizacao: utilizando somente JsonIgnore\nEm teste realizados, o uso de @JsonManagedReference/@JsonBackRefence apresentou alguns problemas com o\nenvio de dados Json em requisições .\nAssim, ao invés de usar @JsonManagedReference/@JsonBackRefence, vamos simplesmente utilizar o\n@JsonIgnore no lado da associação que não deve ser serializada. Para isto faça:\n\n- Para cada classe de domínio:\n- Apague as anotações @JsonManagedReference existentes\n- Troque as anotações @JsonBackRefence por @JsonIgnore\n\n### Curso Projeto full stack completo! Java Spring Boot no back end e Ionic no front end.\nSeção 1: Implementação do modelo conceitual\n- Prof. Dr. Nelio Alves\n\n## Ferramentas e Tecnologias usadas nesse repositório 🌐\n\u003cdiv style=\"display: inline_block\"\u003e\u003cbr\u003e\n\n\u003cimg align=\"center\" alt=\"Augusto-Java\" height=\"60\" width=\"60\" src=https://github.com/devicons/devicon/blob/master/icons/java/java-original.svg \u003e\n\u003cimg align=\"center\" alt=\"Augusto-SpringBoot\" height=\"60\" width=\"60\" src=\"https://raw.githubusercontent.com/devicons/devicon/1119b9f84c0290e0f0b38982099a2bd027a48bf1/icons/spring/spring-original-wordmark.svg\"\u003e\n\u003cimg align=\"center\" alt=\"Augusto-SpringBoot\" height=\"60\" width=\"60\" src=\"https://user-images.githubusercontent.com/101072311/200666111-2e4878bb-7d5c-4103-a159-fd00d0855a5d.png\"\u003e\n\n\u003c/div\u003e    \n\n## Teste o projeto 👁‍🗨\n\nDownload do projeto para testar em sua máquina: https://github.com/AugustoMello09/Modelo-conceitual/archive/refs/heads/master.zip\n\n## Entre em contato comigo através dos canais abaixo e desde já, agradeço a atenção. 🤝\n  \n\u003cdiv\u003e\n  \n  \u003ca href=\"https://www.linkedin.com/in/jos%C3%A9-augusto-mello-794a94234\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/-LinkedIn-%230077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\" target=\"_blank\"\u003e\u003c/a\u003e\n  \u003ca href=\"mailto:joseaugusto.Mello01@gmail.com\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/Gmail-D14836?style=for-the-badge\u0026logo=gmail\u0026logoColor=white\" target=\"_blank\"\u003e\u003c/a\u003e\n\n  \u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faugustomello09%2Fmodelo-conceitual","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faugustomello09%2Fmodelo-conceitual","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faugustomello09%2Fmodelo-conceitual/lists"}