Index: my-react-app/src/components/ReservationConfirmation.js
===================================================================
--- my-react-app/src/components/ReservationConfirmation.js	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ my-react-app/src/components/ReservationConfirmation.js	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -56,5 +56,5 @@
             rating: parseFloat(restaurant.rating) || null,
             tableNumber: parseInt(table.id, 10),
-            restaurant: restaurant,
+            restaurantId: restaurant.restaurantId,
             reservationDateTime: adjustedTimeSlot,
             partySize: parseInt(partySize, 10),
@@ -62,10 +62,20 @@
             specialRequests: specialRequests.trim(),
             paymentStatus: 'Pending',
-            preOrderedItems: preOrderedItems.map(item => `${item.itemName}:${item.quantity}:${item.price}`)
+            preOrderedItems: preOrderedItems.map(item => ({
+                name: item.itemName,
+                quantity: item.quantity,
+                price: item.price
+            }))
         };
+        console.log(payload)
 
 
         try {
-            const response = await axios.post('http://localhost:8081/api/reservations', payload);
+            console.log(payload)
+            const response = await axios.post('http://localhost:8081/api/reservations', payload, {
+                headers: {
+                    'Content-Type': 'application/json'
+                }
+            });
             console.log('Reservation created successfully:', response.data);
             navigate("/reservations")
Index: my-react-app/src/components/Reservations.js
===================================================================
--- my-react-app/src/components/Reservations.js	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ my-react-app/src/components/Reservations.js	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -1,12 +1,13 @@
-import React, { useState, useEffect } from 'react';
+import React, {useState, useEffect, useContext} from 'react';
 import axios from 'axios';
 import 'bootstrap/dist/css/bootstrap.min.css';
 import {useNavigate} from "react-router-dom";
 import {jwtDecode} from "jwt-decode";
+import {RestaurantContext} from "./RestaurantContext";
 
 
 const Reservations = () => {
     const navigate = useNavigate();
-
+    const { restaurants } = useContext(RestaurantContext);
     const [reservations, setReservations] = useState([]);
 
@@ -24,5 +25,4 @@
                 const response = await axios.get(`http://localhost:8081/api/reservations/by/${userId}`);
                 setReservations(response.data);
-                console.log(response.data)
             } catch (error) {
                 console.error('Error fetching reservations:', error);
@@ -63,6 +63,12 @@
                                 <div className="card-body">
                                     <h5 className="card-title">Reservation ID: {reservation.reservationID}</h5>
-                                    <p className="card-text">Restaurant: {reservation?.restaurant.name || "Not specified"}</p>
-                                    <p className="card-text">Table Number: {reservation?.tableNumber || "Not specified"}</p>
+                                    <p className="card-text">
+                                        Restaurant: {
+                                        restaurants.find(r => r.restaurantId === reservation.restaurantId)?.name || "Not specified"
+                                    }
+                                    </p>
+
+                                    <p className="card-text">Table
+                                        Number: {reservation?.tableNumber || "Not specified"}</p>
                                     <p className="card-text">
                                         Reservation Date: {reservation.checkInTime ?
@@ -93,26 +99,14 @@
                                             <h5 className="text-primary">Pre-Ordered Items:</h5>
                                             <ul className="list-group mb-3">
-                                                {reservation.preOrderedItems.map((itemStr, index) => {
-                                                    const parts = itemStr.split(':');
-                                                    const name = parts[0];
-                                                    const quantity = parseInt(parts[1], 10) || 0;
-                                                    const price = parseFloat(parts[2]) || 0;
-
-                                                    return (
-                                                        <li key={index} className="list-group-item d-flex justify-content-between align-items-center">
-                                                            <span><strong>{name}</strong> × {quantity}</span>
-                                                            <span className="badge bg-success rounded-pill">${(price * quantity).toFixed(2)}</span>
-                                                        </li>
-                                                    );
-                                                })}
+                                                {reservation.preOrderedItems.map((item, index) => (
+                                                    <li key={index} className="list-group-item d-flex justify-content-between align-items-center">
+                                                        <span><strong>{item.name}</strong> × {item.quantity}</span>
+                                                        <span className="badge bg-success rounded-pill">${(item.price * item.quantity).toFixed(2)}</span>
+                                                    </li>
+                                                ))}
                                             </ul>
 
                                             <div className="alert alert-info text-center" role="alert">
-                                                <h5>Grand Total: ${reservation.preOrderedItems.reduce((acc, itemStr) => {
-                                                    const parts = itemStr.split(':');
-                                                    const quantity = parseInt(parts[1], 10) || 0;
-                                                    const price = parseFloat(parts[2]) || 0;
-                                                    return acc + (quantity * price);
-                                                }, 0).toFixed(2)}</h5>
+                                                <h5>Grand Total: ${reservation.preOrderedItems.reduce((acc, item) => acc + (item.quantity * item.price), 0).toFixed(2)}</h5>
                                             </div>
                                         </div>
Index: my-react-app/src/components/RestaurantContext.js
===================================================================
--- my-react-app/src/components/RestaurantContext.js	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ my-react-app/src/components/RestaurantContext.js	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -8,7 +8,9 @@
 
     useEffect(() => {
+        if (restaurants.length > 0) return;
         const fetchRestaurants = async () => {
             try {
                 const response = await axios.get('http://localhost:8081/api/restaurants');
+                console.log("Fetched once", response.data);
                 setRestaurants(response.data);
             } catch (error) {
@@ -16,5 +18,4 @@
             }
         };
-
         fetchRestaurants();
     }, []);
Index: my-react-app/src/components/Restaurants.js
===================================================================
--- my-react-app/src/components/Restaurants.js	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ my-react-app/src/components/Restaurants.js	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -26,4 +26,5 @@
     const navigate = useNavigate();
     const restaurantContext = useContext(RestaurantContext);
+    console.log(restaurantContext)
 
     useEffect(() => {
Index: src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/dto/ReservationDTO.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -1,4 +1,5 @@
 package com.example.rezevirajmasa.demo.dto;
 
+import com.example.rezevirajmasa.demo.model.PreorderedItem;
 import com.example.rezevirajmasa.demo.model.Reservation;
 import com.example.rezevirajmasa.demo.model.Restaurant;
@@ -15,16 +16,15 @@
     private LocalDateTime reservationDateTime;
     private LocalDateTime checkInTime;
-    private Restaurant restaurant;
+    private Long restaurantId;
     private int partySize;
     private String status;
     private String specialRequests;
     private String paymentStatus;
-    private List<String> preOrderedItems;
-
+    private List<PreorderedItem> preOrderedItems;
 
     public ReservationDTO() {
     }
 
-    public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Restaurant restaurant, int partySize, String status, String specialRequests, String paymentStatus, List<String> preOrderedItems) {
+    public ReservationDTO(Long reservationID, String userEmail, BigDecimal rating, Long tableNumber, LocalDateTime reservationDateTime, LocalDateTime checkInTime, Long restaurantId, int partySize, String status, String specialRequests, String paymentStatus, List<PreorderedItem> preOrderedItems) {
         this.reservationID = reservationID;
         this.userEmail = userEmail;
@@ -33,5 +33,5 @@
         this.reservationDateTime = reservationDateTime;
         this.checkInTime = checkInTime;
-        this.restaurant = restaurant;
+        this.reservationID = restaurantId;
         this.partySize = partySize;
         this.status = status;
@@ -48,5 +48,5 @@
         this.reservationDateTime = reservation.getReservationDateTime();
         this.checkInTime = reservation.getCheckInTime();
-        this.restaurant = reservation.getRestaurant();
+        this.restaurantId = reservation.getRestaurant().getRestaurantId();
         this.partySize = reservation.getPartySize();
         this.status = reservation.getStatus();
@@ -54,12 +54,4 @@
         this.paymentStatus = reservation.getPaymentStatus();
         this.preOrderedItems = reservation.getPreOrderedItems();
-    }
-
-    public List<String> getPreOrderedItems() {
-        return preOrderedItems;
-    }
-
-    public void setPreOrderedItems(List<String> preOrderedItems) {
-        this.preOrderedItems = preOrderedItems;
     }
 
@@ -112,10 +104,10 @@
     }
 
-    public Restaurant getRestaurant() {
-        return restaurant;
+    public Long getRestaurantId() {
+        return restaurantId;
     }
 
-    public void setRestaurant(Restaurant restaurant) {
-        this.restaurant = restaurant;
+    public void setRestaurantId(Long restaurantId) {
+        this.restaurantId = restaurantId;
     }
 
@@ -151,3 +143,11 @@
         this.paymentStatus = paymentStatus;
     }
+
+    public List<PreorderedItem> getPreOrderedItems() {
+        return preOrderedItems;
+    }
+
+    public void setPreOrderedItems(List<PreorderedItem> preOrderedItems) {
+        this.preOrderedItems = preOrderedItems;
+    }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/model/Menu.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Menu.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Menu.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -6,4 +6,6 @@
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 
 @Entity
@@ -13,31 +15,32 @@
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "MenuID")
+    @Column(name = "menu_id")
     private Long menuID;
 
     @ManyToOne
-    @JoinColumn(name = "RestaurantID", nullable = false)
+    @JoinColumn(name = "restaurant_id", nullable = false)
     @JsonIgnore
     private Restaurant restaurant;
 
-    @Column(name = "ItemName", length = 100)
+    @Column(name = "item_name", length = 100)
     private String itemName;
 
-    @Column(name = "Category", length = 50)
+    @Column(name = "category", length = 50)
     private String category;
 
-    @Column(name = "Price", precision = 8, scale = 2)
+    @Column(name = "price", precision = 8, scale = 2)
     private BigDecimal price;
 
-    @Column(name = "Description")
+    @Column(name = "description")
     private String description;
 
-    @Column(name = "DietaryInformation", columnDefinition = "JSONB")
-    private String dietaryInformation;
+    @OneToMany(mappedBy = "menu", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
+    private List<MenuTag> tags = new ArrayList<>();
 
     public Menu() {
     }
 
-    public Menu(Restaurant restaurant, String itemName, String category, BigDecimal price, String description, String dietaryInformation) {
+    public Menu(Long menuID, Restaurant restaurant, String itemName, String category, BigDecimal price, String description, List<MenuTag> tags) {
+        this.menuID = menuID;
         this.restaurant = restaurant;
         this.itemName = itemName;
@@ -45,5 +48,5 @@
         this.price = price;
         this.description = description;
-        this.dietaryInformation = dietaryInformation;
+        this.tags = tags;
     }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
+++ src/main/java/com/example/rezevirajmasa/demo/model/MenuTag.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import jakarta.persistence.*;
+import lombok.Data;
+
+@Entity
+@Table(name = "menu_tags")
+@Data
+public class MenuTag {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "menu_id", nullable = false)
+    @JsonIgnore
+    private Menu menu;
+
+    @Column(name = "tag_name", nullable = false)
+    private String tagName;
+
+    @Column(name = "tag_value", nullable = false)
+    private String tagValue;
+
+    public MenuTag() {}
+
+    public MenuTag(Menu menu, String tagName, String tagValue) {
+        this.menu = menu;
+        this.tagName = tagName;
+        this.tagValue = tagValue;
+    }
+}
+
Index: src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
+++ src/main/java/com/example/rezevirajmasa/demo/model/PreorderedItem.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.model;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Entity
+@Table(name = "reservation_preordered_items")
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class PreorderedItem {
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    private String name;
+
+    private Integer quantity;
+
+    private BigDecimal price;
+
+    @JsonIgnore
+    @ManyToOne
+    @JoinColumn(name = "reservation_id", nullable = false)
+    private Reservation reservation;
+}
Index: src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -26,5 +26,5 @@
     @ManyToOne
     @JoinColumn(name = "UserID")
-    @JsonManagedReference
+    @JsonBackReference(value = "user-reservations")
     private User user;
 
@@ -57,8 +57,10 @@
     private LocalDateTime checkOutTime;
 
-    @ElementCollection
-    @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
-    @Column(name = "item")
-    private List<String> preOrderedItems = new ArrayList<>();
+//    @ElementCollection
+//    @CollectionTable(name = "reservation_preordered_items", joinColumns = @JoinColumn(name = "reservation_id"))
+//    @Column(name = "item")
+//    private List<String> preOrderedItems = new ArrayList<>();
+    @OneToMany(mappedBy = "reservation", cascade = CascadeType.ALL, orphanRemoval = true)
+    private List<PreorderedItem> preOrderedItems = new ArrayList<>();
 
     @Column(name = "PaymentStatus", length = 20, nullable = false, columnDefinition = "VARCHAR default 'Unpaid'")
Index: src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -41,5 +41,5 @@
     private BigDecimal rating;
 
-    @JsonIgnore
+    @JsonManagedReference
     @OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private List<TableEntity> tablesList;
Index: src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/model/TableEntity.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -29,5 +29,5 @@
 
     @JsonBackReference
-    @ManyToOne(fetch = FetchType.EAGER)
+    @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumn(name = "RestaurantID")
     private Restaurant restaurant;
Index: src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -11,5 +11,5 @@
 
 public interface ReservationService {
-    public Reservation makeReservationRest(ReservationDTO reservation, User user);
+    public Reservation makeReservationRest(ReservationDTO reservation, User user, Restaurant restaurant);
     public List<Reservation> listAll();
     public Reservation updateReservation(Long reservationId, ReservationDTO reservationDTO, User user);
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -26,7 +26,9 @@
 
 import javax.swing.text.html.Option;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -55,5 +57,5 @@
 
     @Override
-    public Reservation makeReservationRest(ReservationDTO reservationDTO, User user) {
+    public Reservation makeReservationRest(ReservationDTO reservationDTO, User user, Restaurant restaurant) {
         Reservation reservation = new Reservation();
 
@@ -92,10 +94,22 @@
             reservation.setPaymentStatus(reservationDTO.getPaymentStatus() != null ? reservationDTO.getPaymentStatus() : "Unpaid");
             reservation.setUser(user);
-            reservation.setPreOrderedItems(reservationDTO.getPreOrderedItems());
-            reservation.setRestaurant(reservationDTO.getRestaurant());
+
+            List<PreorderedItem> preOrderedItems = new ArrayList<>();
+
+            for (PreorderedItem dtoItem : reservationDTO.getPreOrderedItems()) {
+                PreorderedItem item = new PreorderedItem();
+                item.setName(dtoItem.getName());
+                item.setQuantity(dtoItem.getQuantity());
+                item.setPrice(dtoItem.getPrice());
+                item.setReservation(reservation);
+
+                preOrderedItems.add(item);
+            }
+
+            reservation.setPreOrderedItems(preOrderedItems);
+            reservation.setRestaurant(restaurant);
             reservation.setCheckInTime(reservationDTO.getReservationDateTime().plusHours(1));
             reservation.setReservationDateTime(LocalDateTime.now());
             reservation.setCheckOutTime(reservationDTO.getReservationDateTime().plusHours(3));
-            reservation.setRestaurant(reservationDTO.getRestaurant());
 
             return reservationRepository.save(reservation);
Index: src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision e15e8d976a275ebb70018ca698e8c0f11b3f09df)
+++ src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision 2518b3a6aa84204d9520a068dae1a3b3234ea5f6)
@@ -181,7 +181,8 @@
 
     @PostMapping("/api/reservations")
-    public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation) {
-        User user = userService.findByMail(reservation.getUserEmail());
-        Reservation savedReservation = reservationService.makeReservationRest(reservation, user);
+    public ResponseEntity<?> createReservation(@RequestBody ReservationDTO reservation){
+    User user = userService.findByMail(reservation.getUserEmail());
+    Restaurant restaurant = restaurantService.findByIdRestaurant(reservation.getRestaurantId());
+        Reservation savedReservation = reservationService.makeReservationRest(reservation, user, restaurant);
 
         return new ResponseEntity<>(savedReservation, HttpStatus.CREATED);
@@ -227,5 +228,5 @@
                                                        @PathVariable String email) {
         User user = userService.findByMail(email);
-
+        Restaurant restaurant = restaurantService.findByIdRestaurant(reservationDTO.getRestaurantId());
         if (!reservationDTO.getReservationID().equals(reservationId)) {
             return ResponseEntity.badRequest().build();
