В моём проете есть основная таблица 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; // Флаг для главного изображения
}