{"id":18369580,"url":"https://github.com/henriqueotogami/learning-jpa","last_synced_at":"2026-05-17T15:31:50.574Z","repository":{"id":63096957,"uuid":"533829028","full_name":"henriqueotogami/learning-jpa","owner":"henriqueotogami","description":"Estudos de Java Persistente API, utilizando o framework Hibernate e o conceito de Data Mapper e ORM no MySQL8. ","archived":false,"fork":false,"pushed_at":"2025-03-04T05:33:29.000Z","size":672,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-04T06:28:37.393Z","etag":null,"topics":["datamapper","intellij-idea","java-11","jpa-hibernate","mysql8","orm"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/henriqueotogami.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-09-07T15:35:28.000Z","updated_at":"2025-03-04T05:33:33.000Z","dependencies_parsed_at":"2023-02-16T15:15:56.004Z","dependency_job_id":null,"html_url":"https://github.com/henriqueotogami/learning-jpa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henriqueotogami%2Flearning-jpa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henriqueotogami%2Flearning-jpa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henriqueotogami%2Flearning-jpa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/henriqueotogami%2Flearning-jpa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/henriqueotogami","download_url":"https://codeload.github.com/henriqueotogami/learning-jpa/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281424,"owners_count":21077423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["datamapper","intellij-idea","java-11","jpa-hibernate","mysql8","orm"],"created_at":"2024-11-05T23:29:53.226Z","updated_at":"2026-05-17T15:31:50.564Z","avatar_url":"https://github.com/henriqueotogami.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Learning JPA\n\n\u003cimg width=\"auto\" src=\"https://github.com/henriqueotogami/learning-jpa/blob/main/JPA.png?raw=true\" alt=\"JPA\"\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg alt=\"GitHub last commit\" src=\"https://img.shields.io/github/last-commit/henriqueotogami/learning-jpa\"\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cimg src=\"https://img.shields.io/github/issues/henriqueotogami/learning-jpa\" alt=\"issues\"\u003e\n\u003cimg src=\"https://img.shields.io/github/forks/henriqueotogami/learning-jpa\" alt=\"forks\"\u003e\n\u003cimg src=\"https://img.shields.io/github/stars/henriqueotogami/learning-jpa\" alt=\"stars\"\u003e\n\u003cimg src=\"https://img.shields.io/github/license/henriqueotogami/learning-jpa\" alt=\"license\"\u003e\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://wakatime.com/badge/user/1e53636e-c916-4d50-9ce1-f3ac75a883e3/project/e1e8111a-56a9-412e-b441-1f48a2906789\"\u003e\u003cimg src=\"https://wakatime.com/badge/user/1e53636e-c916-4d50-9ce1-f3ac75a883e3/project/e1e8111a-56a9-412e-b441-1f48a2906789.svg\" alt=\"wakatime\"\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\u003chr\u003e\n\n\u003e Repositório com estudos e exemplos de **Java Persistence API (JPA)**, utilizando Hibernate, conceitos de **ORM** e **Data Mapper** com MySQL 8. Desenvolvido no curso [Cod3r \\| Java 2022 Completo](https://www.udemy.com/course/fundamentos-de-programacao-com-java/).\n\n---\n\n## 📋 Sobre o Projeto\n\nEste projeto contém uma coleção de entidades JPA, testes e exemplos desenvolvidos para o aprendizado de persistência em Java. Os códigos cobrem operações básicas (CRUD), relacionamentos (One-to-One, One-to-Many, Many-to-Many), composição (embeddable), herança (Single Table, Joined, Table Per Class), acesso a dados via JDBC e JPA, além de named queries e consultas nativas.\n\n## 📁 Estrutura do Projeto\n\n### Entidades e relacionamentos (`src/main/java/model/`)\n\n- **basic/** — Entidades simples: `User`, `Product` (mapeamento básico, colunas, `@Transient`)\n- **onetoone/** — Relacionamento 1:1: `Client` e `Seat`\n- **onetomany/** — Relacionamento 1:N: `RestaurantOrder` e `ItemFromOrder`\n- **manytomany/** — Relacionamento N:N: `Actor`, `Movie`, `MovieRating` (avaliação)\n- **composition/** — Composição/embeddable: `Address`, `Staff`, `Supplier`\n- **inheritance/** — Estratégias de herança:\n  - **singletable/** — `Student`, `ScholarshipStudent` (Single Table)\n  - **joined/** — `Student`, `ScholarshipStudent` (Joined)\n  - **tableperclass/** — `Student`, `ScholarshipStudent` (Table Per Class)\n\n### Infraestrutura e banco (`src/main/java/`)\n\n- **model/database/jpa/** — `PersistenceEntityManager` (EntityManagerFactory e EntityManager)\n- **model/database/jdbc/** — `DatabaseConnectivityManager`, `CreateTablePeople` (acesso via JDBC)\n- **infrastructure/** — `DataAccessObject`, `ProductDAO` (padrão DAO)\n\n### Testes (`src/test/java/model/`)\n\n- **basic/** — insert, query, update, delete, newTable (criação de tabela)\n- **onetoone/** — testes de cliente e assento\n- **onetomany/** — testes de pedido e itens\n- **manytomany/** — filmes, atores, tios/sobrinhos, avaliação\n- **inheritance/** — testes por estratégia (tableperclass, etc.)\n- **query/** — named queries: filmes, pedidos, média de avaliação, cliente e assento\n\n### Configuração (`src/main/resources/`)\n\n- **META-INF/persistence.xml** — unidade de persistência, entidades, propriedades JDBC e Hibernate\n- **META-INF/queries.xml** — named queries e named native queries (JPQL e SQL)\n- **connection.properties** — URL, usuário e senha do banco (JDBC)\n\n## 📂 Estrutura do repositório\n\n```\nLICENSE\nREADME.md\npom.xml\nJPA.png\nsrc/\n  main/\n    java/\n      model/\n        basic/           # User, Product\n        onetoone/        # Client, Seat\n        onetomany/       # RestaurantOrder, ItemFromOrder\n        manytomany/      # Actor, Movie, Uncle, Nephew, MovieRating\n        composition/     # Address, Staff, Supplier\n        inheritance/     # singletable, joined, tableperclass (Student, ScholarshipStudent)\n        database/\n          jpa/           # PersistenceEntityManager\n          jdbc/          # DatabaseConnectivityManager, CreateTablePeople\n      infrastructure/   # DataAccessObject, ProductDAO\n    resources/\n      META-INF/         # persistence.xml, queries.xml\n      connection.properties\n  test/\n    java/\n      model/             # testes por pacote (basic, onetoone, onetomany, manytomany, inheritance, query)\ndocumentation/           # Javadoc gerado\n```\n\n## 🛠️ Tecnologias Utilizadas\n\n- **Java 11** — Linguagem e API\n- **JPA (Jakarta Persistence)** — API de persistência\n- **Hibernate** — Implementação JPA (dialeto MySQL 8)\n- **EclipseLink** — Provider configurado no `persistence.xml`\n- **MySQL 8** — Banco de dados\n- **Maven** — Build e dependências\n- **IntelliJ IDEA** — IDE utilizada no desenvolvimento\n\n## 📝 Funcionalidades Principais\n\n### CRUD e operações básicas\n- Inserção, consulta, atualização e exclusão de entidades\n- Criação de tabelas via código (ex.: `CreateTableProduct`)\n- Uso de `EntityManager` e transações\n\n### Relacionamentos\n- **One-to-One:** Cliente e assento (1:1)\n- **One-to-Many:** Pedido e itens do pedido (1:N)\n- **Many-to-Many:** Filmes e atores; tios e sobrinhos; filmes com avaliação\n\n### Herança\n- Single Table, Joined e Table Per Class com `Student` e `ScholarshipStudent`\n\n### Consultas\n- Named queries em JPQL (`queries.xml` e anotações)\n- Named native queries e `SqlResultSetMapping`\n- Exemplos: filmes com rating acima de um valor, média de avaliação, pedidos, cliente com assento\n\n### Infraestrutura\n- Conexão JPA centralizada em `PersistenceEntityManager`\n- Conexão JDBC em `DatabaseConnectivityManager`\n- Padrão DAO com `DataAccessObject` e `ProductDAO`\n\n## 🚀 Como Executar\n\n### Pré-requisitos\n- **Java 11** (ou superior)\n- **Maven**\n- **MySQL 8** em execução, com um banco (ex.: `course_java`) criado\n\n### Configuração do banco\n1. Crie o banco no MySQL, por exemplo: `CREATE DATABASE course_java;`\n2. Ajuste em `src/main/resources/connection.properties` e em `src/main/resources/META-INF/persistence.xml`:\n   - URL (host, porta, nome do banco)\n   - Usuário e senha\n\n### Compilar e rodar testes\n\n```bash\n# Na raiz do projeto\nmvn clean compile\n\n# Executar todos os testes\nmvn test\n```\n\nPara rodar uma classe de teste específica, use a IDE (IntelliJ) ou, por exemplo:\n\n```bash\nmvn test -Dtest=model.basic.insert.TestNewUser\n```\n\n**Observação:** As dependências JPA/Hibernate/MySQL estão comentadas no `pom.xml`. Para compilar e rodar, descomente o bloco `\u003cdependencies\u003e` no `pom.xml` e ajuste conforme a stack que você usa (Jakarta Persistence, Hibernate, driver MySQL, etc.).\n\n## 📚 Conteúdos Abordados\n\n- ✅ Entidades JPA: `@Entity`, `@Table`, `@Column`, `@Id`, `@GeneratedValue`\n- ✅ Atributos transientes (`@Transient`)\n- ✅ Relacionamentos: `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`, `@JoinColumn`, fetch\n- ✅ Composição: `@Embedded`, `@Embeddable`\n- ✅ Herança: `@Inheritance`, Single Table, Joined, Table Per Class\n- ✅ `EntityManager`, `EntityManagerFactory`, transações\n- ✅ Named queries (JPQL) e named native queries (SQL)\n- ✅ `SqlResultSetMapping` e `@ConstructorResult`\n- ✅ JDBC para comparação e criação de tabelas\n- ✅ Padrão DAO e configuração via `persistence.xml` e `connection.properties`\n\n## ⚙️ Como Funciona\n\n### Fluxo JPA\n1. `Persistence.createEntityManagerFactory(\"course_java\")` lê o `persistence.xml` e cria a fábrica.\n2. `EntityManagerFactory` cria `EntityManager` para operações de persistência.\n3. Os testes abrem transação, persistem/consultam/atualizam/removem entidades e fazem commit/rollback.\n4. As entidades listadas em `\u003cclass\u003e` no `persistence.xml` são gerenciadas pelo provider (Hibernate/EclipseLink).\n\n### Named queries\n- Definidas em `META-INF/queries.xml` (e possivelmente nas entidades).\n- Exemplo: `getMoviesRatingHigherThan` — JPQL com `JOIN FETCH` e parâmetro `:rating`.\n- Exemplo: `getMovieRating` — SQL nativo com `SqlResultSetMapping` para `MovieRating`.\n\n### Estratégias de herança\n- **Single Table:** uma tabela com coluna discriminadora.\n- **Joined:** tabela base + tabelas filhas com FK.\n- **Table Per Class:** uma tabela por classe concreta.\n\n## 🖥️ Ambiente de Desenvolvimento\n\n- **Sistema operacional:** macOS (Monterey 12.6)\n- **IDE:** IntelliJ IDEA Community Edition 2022.2\n\n**Plugins sugeridos:**\n- [Atom Material Icons](https://plugins.jetbrains.com/plugin/10044-atom-material-icons)\n- [Codota AI Autocomplete for Java](https://plugins.jetbrains.com/plugin/7638-codota-ai-autocomplete-for-java-and-javascript)\n- [GitToolBox](https://plugins.jetbrains.com/plugin/7499-gittoolbox)\n- [Nyan Progress Bar](https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar)\n- [Rainbow Brackets](https://plugins.jetbrains.com/plugin/10080-rainbow-brackets)\n- [Wakatime](https://wakatime.com)\n- [Xcode-Dark Theme](https://plugins.jetbrains.com/plugin/13106-xcode-dark-theme)\n\n## 📄 Licença\n\nEste projeto está licenciado sob a **MIT License**. Consulte o arquivo [LICENSE](LICENSE) para mais detalhes.\n\n## 📖 Referências\n\n- [Cod3r \\| Java 2022 Completo](https://www.udemy.com/course/fundamentos-de-programacao-com-java/) — Curso onde o material foi desenvolvido\n- Documentação JPA (Jakarta Persistence) e Hibernate\n- Código-fonte em `src/main/java` e testes em `src/test/java`\n\n---\n\n## 🤝 Contribuições\n\nQualquer ajuda para melhorar este repositório é bem-vinda.\n\n- [ ] Faça um **fork** deste repositório ([link para fork](https://github.com/henriqueotogami/learning-jpa/fork))\n- [ ] Crie um **branch** para suas alterações: `git checkout -b meu-novo-recurso`\n- [ ] Faça **commit**: `git commit -am 'Adicionando um novo recurso ...'`\n- [ ] Envie **push**: `git push origin meu-novo-recurso`\n- [ ] Abra uma **Pull Request** neste repositório\n\nDepois que sua PR for aceita e merged na branch principal, você pode excluir sua branch.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Desenvolvido por HMAP \\| Henrique Matheus Alves Pereira** 🦁\n\n\u003c/div\u003e\n\n---\n\n### Hashtags\n#JPA #Java #Hibernate #ORM #MySQL #JakartaPersistence #DataMapper #JavaPersistence #LearningJava #Backend #Persistence #Cod3r #OpenSource #GitHub #CodeExamples\n\n### Meta Keywords\n```\nJPA, Java Persistence API, Hibernate, ORM, MySQL, Jakarta Persistence,\nData Mapper, entidades, relacionamentos, OneToOne, OneToMany, ManyToMany,\nherança JPA, named queries, EntityManager, Maven, Java 11, curso Java,\npersistência, CRUD, Cod3r, código exemplo, aprendizado\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenriqueotogami%2Flearning-jpa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhenriqueotogami%2Flearning-jpa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhenriqueotogami%2Flearning-jpa/lists"}