Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot Application connection to PostgreSQL database

I very recently started learning Java and spring boot and I was following a youtube tutorial on how to build a small project, but when it got to the point of checking the connection to the database i got this message:

customer=# \dt
Did not find any relations.

And because i'm very much unfamilar with java and spring boot, i find myself debugging with no clear workflow. If anyone could guide me in the right direction I'd very much appreciate it.

Here is my code:

Main.java

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Objects;

@SpringBootApplication
@RestController
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }

    @GetMapping("/")
    public GreetingResponse greeting(){
        GreetingResponse greetingString = new GreetingResponse(
                "Hello",
                List.of("Python", "Python", "Python"),
                new Person("Batool", 28, 500_000)
        );
        return greetingString;


    }

    record Person(String name, int age, double savings){

    }
    record GreetingResponse(
            String greeting,
            List<String> favProgrammingLanguages,
            Person person
    ){
    }

Customer.java

import java.util.Objects;

import jakarta.persistence.*;
@Entity
public class Customer {
    @Id
    @SequenceGenerator(name = "customer_id_sequence", sequenceName = "customer_id_sequence")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "customer_id_sequence")
    private Integer id;
    private String name;
    private String email;
    private Integer age;


    public Customer(Integer id, String name, String email, Integer age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    }


    public Integer getId() {
        return id;
    }

    public String getName() {
        return name;
    }
    public String getEmail() {
        return email;
    }

    public Integer getAge() {
        return age;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
    public void setEmail(String email) {
        this.email = email;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return Objects.equals(id, customer.id) && Objects.equals(name, customer.name) && Objects.equals(email, customer.email) && Objects.equals(age, customer.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, email, age);
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

docker-compose.yml

services:
  db:
    container_name: postgres
    image: postgres
    environment:
      POSTGRES_USER: <>
      POSTGRES_PASSWORD: <>
      PGDATA: /data/postgres
    volumes:
      - db:/data/postgres
    ports:
      - "5332:5432"
    networks:
      - db
    restart: unless-stopped

networks:
  db:
    driver: bridge

volumes:
  db:

application.yml

server:
  port: 8080

spring:
  datasource:
    platform: postgres
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://db:5332/customer
    username: <>
    password: <>
  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format-sql: true
      show-sql: true
    main:
      web-development-type: servlet
like image 621
Batool Ragayah Avatar asked Sep 06 '25 03:09

Batool Ragayah


2 Answers

You are telling Spring to connect to a database server with a hostname of db. But that db hostname will only work from within the docker bridge network created inside docker-compose. If you were running the Spring Boot application as another service inside the docker-compose file, then that address would work. But you don't appear to be doing that.

You most likely need to change the datasource URL in the Spring config file to this:

url: jdbc:postgresql://localhost:5332/customer

Because this line in your docker-compose file is exposing the database service on port 5332 on your local computer, or localhost:

    ports:
      - "5332:5432"
like image 173
Mark B Avatar answered Sep 07 '25 22:09

Mark B


The jdbc connection has to find the schema name, and because an error that eventually bubbles up thru spring, to the application. This connects:

  1. spring.datasource.url = jdbc:postgresql://localhost:5432/postgres?currentSchema=public
  2. spring.datasource.username = postgres
  3. spring.datasource.password = password
  4. spring.jpa.hibernate.ddl-auto = update

worked for me

like image 32
panatechnica Avatar answered Sep 07 '25 21:09

panatechnica