В моём проете есть основная таблица Product и связанная с ней таблица ProductImage отношением один ко многим для хранения изображений товара. В базе изображения храняться в виже URL /img/O1.png. Делал SQL запросы чтобы точно убедиться что таблицы связаны и можно получить изображение по ID продукта но в вёрстке появляется только дефолтная картинка. Код предоставляю ниже, буду благодарен любой помощи. Вёрстка
<img th:src="@{${primaryImage != null ? primaryImage.imageUrl : '/img/O3.png'}}"
             th:alt="${product.name}">
ProductController
@GetMapping("/{id}")
    public String getProductDetails(@PathVariable Long id, Model model) {
        Product product = service.findById(id);
        if (product == null) {
            return "redirect:/api/v1/home"; // Если продукт не найден, редирект на главную
        }

        // Логирование данных о продукте
        System.out.println("Product found: " + product.getId() + ", " + product.getName());
        System.out.println("Number of images: " + product.getImages().size());  // Проверка размера коллекции

        model.addAttribute("product", product);

        // Логирование primaryImage
        ProductImage primaryImage = product.getPrimaryImage();
        System.out.println("Primary image URL: " + (primaryImage != null ? primaryImage.getImageUrl() : "No primary image"));

        model.addAttribute("primaryImage", primaryImage);

        return "product-details"; // Отображение страницы продукта
    }
Модель Product
package OnlineStoreWemalpa.com.OnlineStore.model;

import jakarta.persistence.*;
import lombok.Data;

import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;

@Data
@Entity
@Table(name = "product")
public class Product {
    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false, length = 255)
    private String name;

    @Column(name = "decsription")
    private String decsription;

    @Column(name = "price", nullable = false)
    private BigDecimal price;

    @Column(name = "gender")
    private String gender;

    @Column(name = "clothing_type", nullable = false)
    private String clothingType;

    @ManyToOne
    @JoinColumn(name = "print_type_id", nullable = false)
    private PrintType printType;

    @ManyToOne
    @JoinColumn(name = "material_id", nullable = false)
    private Material material;

    @ManyToOne
    @JoinColumn(name = "color_id", nullable = false)
    private Color color;

    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<ProductSize> sizes;  // Связь с размерами продукта

    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<ProductImage> images = new HashSet<>();  // Связь с изображениями продукта

    public ProductImage getPrimaryImage() {
        if (images == null || images.isEmpty()) {
            System.out.println("No images found for product.");
            return null;  // Если нет изображений, возвращаем null
        }

        ProductImage primaryImage = images.stream()
                .filter(ProductImage::getIsPrimary)
                .findFirst()
                .orElseGet(() -> {
                    System.out.println("Returning first image as primary.");
                    return images.iterator().next();
                });

        System.out.println("Primary Image URL: " + primaryImage.getImageUrl());
        return primaryImage;
    }
}
Модель ProductImage
package OnlineStoreWemalpa.com.OnlineStore.model;

import jakarta.persistence.*;
import lombok.Data;


@Data
@Entity
@Table(name = "product_image")
public class ProductImage {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "product_id", nullable = false)
    private Product product;

    @Column(name = "image_url", nullable = false)
    private String imageUrl;

    @Column(name = "is_primary")
    private Boolean isPrimary; // Флаг для главного изображения

}