Skip to content

kr1s6/Java-Spring-RestAPI-JPA-PostgreSQL_with_Docker

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java REST API with Spring Boot, Spring Data JPA, PostgreSQL with Docker

This project demonstrates a simple Java REST API built with Spring Boot, Spring Data JPA, and PostgreSQL, running the database in Docker.

Based on the course:

Spring Boot Tutorial for Beginners | Full Course 2025 by amigoscode


🧱 Tech Stack

  • Java 21
  • Spring Boot
  • Spring Data JPA (Hibernate)
  • PostgreSQL
  • Docker & Docker Compose

🐳 PostgreSQL in Docker

docker-compose.yml

services:
  db:
    container_name: postgres-spring-boot
    image: postgres:18.1-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: postgres   # database name will be the same as username
      POSTGRES_PASSWORD:
      PGDATA: /data/postgres
    volumes:
      - db:/data/postgres
    ports:
      - "5332:5432"
    networks:
      - db

networks:
  db:
    driver: bridge

volumes:
  db:

▶️ Run PostgreSQL

docker compose up -d

Connecting docker container to pgAdmin 4

  • register - > server
  • Host name: localhost
  • Port: 5332
  • Connect

🧭 Navigating PostgreSQL Container

Enter the container

docker exec -it (container id) bash

Open PostgreSQL shell

psql -U (username = postgres)

Useful PostgreSQL commands

\l    \list              -- list databases
CREATE DATABASE spring;
\c spring   \connect     -- connect to database
\q 						           -- exit psql 
\c postgres				       -- exit to base database
\d                       -- list tables
\d engineers             -- show table structure

Deleting DB

DELETE DATABASE name;
docker compose down -v
-v - removes data volumes and your db (is needed to create db again with docker compose up)

📊 Fetching Data from PostgreSQL

SELECT * FROM engineers;

Example output:

 id |  name
----+--------
  1 | Albert
  2 | Megan

📦 Spring Data JPA Repository

JPQL Query with JOIN FETCH

@Query("SELECT DISTINCT e FROM SoftwareEngineer e LEFT JOIN FETCH e.techStack")
List<SoftwareEngineer> findAllWithTechStack();

🧠 JPQL Notes

  • FETCH → forces eager loading of related collections
  • LEFT JOIN → includes engineers without tech stack
  • DISTINCT → removes duplicate entity instances caused by joins

What this JPQL does

  • Fetches SoftwareEngineer entities
  • Loads @ElementCollection techStack eagerly
  • Prevents duplicate entities using DISTINCT

🔄 Equivalent SQL Generated by Hibernate

SELECT e.id, e.name, t.tech_stack
FROM software_engineer e
LEFT JOIN software_engineer_tech_stack t
ON e.id = t.software_engineer_id;

🌐 Spring MVC Annotations

@RestController

  • Used for REST APIs
  • Returns JSON / XML responses
  • Combines @Controller + @ResponseBody

@Controller

  • Used for MVC applications
  • Returns HTML views (Thymeleaf, JSP, etc.)

🧩 JPA / Hibernate Best Practices

  • JPA entities must have a no-args constructor
@NoArgsConstructor
  • Avoid implementing equals() and hashCode() when using generated IDs

    • Unless explicitly designed to ignore the ID
    • Incorrect implementations can break Hibernate behavior

✅ Summary

  • Docker simplifies PostgreSQL setup
  • JPQL operates on entities, not tables
  • JOIN FETCH is essential for loading @ElementCollection
  • Never expose entities directly in APIs — use DTOs

About

Spring Boot Tutorial for Beginners | Full Course 2025 by amigoscode

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages