# fradantim/spring-graphql-2-jpa architecture

> Architecture diagram of the GitHub repository fradantim/spring-graphql-2-jpa, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/fradantim/spring-graphql-2-jpa
- Repository: https://github.com/fradantim/spring-graphql-2-jpa

## Overview

This Spring GraphQL/JPA proof of concept turns GraphQL field selections into JPA fetch joins so requests fetch only the related entity graph they select. A client query reaches book resolvers, which pass the selection set to repository queries; the translator builds fetch clauses and JPA loads the book data. The project also generates a GraphQL schema and exposes multi-ID, POJO-input, and enum-echo operations. The shown code supports the resolver-to-query flow; details of schema discovery and runtime configuration are only partially excerpted.

Main entry points: [`src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java`](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java) (Book queries), [`src/main/java/com/fradantim/graphql2jpa/entity/Book.java`](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Book.java) (Book entity), [`src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java`](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java) (Book resolvers), [`src/main/java/com/fradantim/graphql2jpa/entity/Person.java`](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Person.java) (Person entity)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_graphql["GraphQL API"]
  node_schema["Schema generation<br/>[GraphQLConfig.java]"]
  node_resolver["Book resolvers"]
  node_cover["Cover enum<br/>[Cover.java]"]
end

subgraph group_fetch["Selection-Based Fetching"]
  node_repository["Book queries"]
  node_translator["Fetch translator"]
  node_database[("Relational database")]
end

subgraph group_domain["Book Domain"]
  node_book["Book entity<br/>[Book.java]"]
  node_person["Person entity<br/>[Person.java]"]
  node_country["Country entity<br/>[Country.java]"]
  node_quote["Quote entity<br/>[Quote.java]"]
  node_missing["Missing entity"]
end

node_client(("GraphQL client"))

node_client -->|"submits query"| node_resolver
node_resolver -->|"queries books"| node_repository
node_resolver -->|"echoes enum"| node_cover
node_repository -->|"builds fetches"| node_translator
node_repository -->|"executes JPQL"| node_database
node_repository -->|"loads entities"| node_book
node_book -->|"references author and reviewers"| node_person
node_book -->|"references quotes"| node_quote
node_book -->|"references collection"| node_missing
node_person -->|"references country"| node_country

click node_schema "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/config/GraphQLConfig.java"
click node_resolver "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java"
click node_cover "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/model/Cover.java"
click node_repository "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java"
click node_translator "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/utils/GraphQLEntityFetchTranslator.java"
click node_book "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Book.java"
click node_person "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Person.java"
click node_country "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Country.java"
click node_quote "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Quote.java"
click node_missing "https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/NonExistingEntity.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_schema,node_resolver,node_cover,node_client toneBlue
class node_repository,node_translator,node_database toneAmber
class node_book,node_person,node_country,node_quote,node_missing toneMint
```

## Components

### GraphQL API

- [Schema generation](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/config/GraphQLConfig.java): `src/main/java/com/fradantim/graphql2jpa/config/GraphQLConfig.java`
- [Book resolvers](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java): `src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java`
- [Cover enum](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/model/Cover.java): `src/main/java/com/fradantim/graphql2jpa/model/Cover.java`

### Selection-Based Fetching

- [Book queries](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java): `src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java`
- [Fetch translator](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/utils/GraphQLEntityFetchTranslator.java): `src/main/java/com/fradantim/graphql2jpa/utils/GraphQLEntityFetchTranslator.java`
- **Relational database**

### Book Domain

- [Book entity](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Book.java): `src/main/java/com/fradantim/graphql2jpa/entity/Book.java`
- [Person entity](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Person.java): `src/main/java/com/fradantim/graphql2jpa/entity/Person.java`
- [Country entity](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Country.java): `src/main/java/com/fradantim/graphql2jpa/entity/Country.java`
- [Quote entity](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/Quote.java): `src/main/java/com/fradantim/graphql2jpa/entity/Quote.java`
- [Missing entity](https://github.com/fradantim/spring-graphql-2-jpa/blob/main/src/main/java/com/fradantim/graphql2jpa/entity/NonExistingEntity.java): `src/main/java/com/fradantim/graphql2jpa/entity/NonExistingEntity.java`

### Other components

- **GraphQL client**

## Connections

- GraphQL client → Book resolvers: submits query (evidence: `README.md`)
- Book resolvers → Book queries: queries books (evidence: `src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java`)
- Book resolvers → Cover enum: echoes enum (evidence: `src/main/java/com/fradantim/graphql2jpa/controller/BookGraphQLController.java`)
- Book queries → Fetch translator: builds fetches (evidence: `src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java`)
- Book queries → Relational database: executes JPQL (evidence: `src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java`)
- Book queries → Book entity: loads entities (evidence: `src/main/java/com/fradantim/graphql2jpa/repository/BookRepository.java`)
- Book entity → Person entity: references author and reviewers (evidence: `src/main/java/com/fradantim/graphql2jpa/entity/Book.java`)
- Book entity → Quote entity: references quotes (evidence: `src/main/java/com/fradantim/graphql2jpa/entity/Book.java`)
- Book entity → Missing entity: references collection (evidence: `src/main/java/com/fradantim/graphql2jpa/entity/Book.java`)
- Person entity → Country entity: references country (evidence: `src/main/java/com/fradantim/graphql2jpa/entity/Person.java`)
