Spring Boot, JPA, форма заказа

Я хочу сделать форму заказа с весенней загрузкой, где я могу сохранить заказ с большим количеством позиций заказа. Я не знаю, как реализовать для этого сервис, класс и даже страницу тимелеафа. Любая подсказка будет здорово! Вот фото, что я хочу сделать

Вот мои два класса сущностей (без геттеров и сеттеров и клиента для краткости)

@Entity
@Table(name = "order_item")
public class OrderItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product;
    
    private int qty;
    private double amount;
    
    
    public OrderItem() {}
    
    public OrderItem(int id, Order order, Product product, int qty, double amount) {
        super();
        this.id = id;
        this.order = order;
        this.product = product;
        this.qty = qty;
        this.amount = amount;
    }

    @Entity
@Table(name = "order")
public class Order {
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;
    
    private Date dateTime;
    private double total;
    private int paidStatus;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_id")
    private Customers customer;
    

    @OneToMany(mappedBy = "customOrder")
    private List<OrderItem> orderItems;

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
803
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужно создать репозиторий, сервис и контроллер.

1. Для начала создадим репозитории для наших моделей.

public interface CustomerRepository extends JpaRepository<Customer, Long> {}
public interface ProductRepository extends JpaRepository<Product, Long> {}
public interface OrderRepository extends JpaRepository<Order, Long> {}

2. Во-вторых, давайте создадим наш сервисный слой. (Примечание: я собрал весь функционал здесь для примера. Вы можете распределить его по разным слоям.)

public interface OrderService {
    List<Customer> findAllCustomers();
    List<Product> findAllProducts();
    List<Order> findAllOrders();
}
@Service
public class OrderServiceImpl implements OrderService {

    private final CustomerRepository customerRepository;
    private final ProductRepository productRepository;
    private final OrderRepository orderRepository;

    public OrderServiceImpl(CustomerRepository customerRepository,
                            ProductRepository productRepository,
                            OrderRepository orderRepository) {
        this.customerRepository = customerRepository;
        this.productRepository = productRepository;
        this.orderRepository = orderRepository;
    }

    @Override
    public List<Customer> findAllCustomers() {
        return customerRepository.findAll();
    }

    @Override
    public List<Product> findAllProducts() {
        return productRepository.findAll();
    }

    @Override
    public List<Order> findAllOrders() {
        return orderRepository.findAll();
    }
}

3. Теперь добавьте слой контроллера, он будет отвечать на ваши URL-адреса. (Примечание: здесь приведены простые примеры, чтобы помочь вам понять операцию. Вы можете придумать много разных решений.)

@Controller
@RequestMapping("/order")
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping("/create")
    public String createOrder(Model model) {
        model.addAttribute("customers", orderService.findAllCustomers());
        model.addAttribute("products", orderService.findAllProducts());
        model.addAttribute("order", new Order());
        return "order-form";
    }

    @PostMapping("/insert")
    public String insertOrder(Model model, Order order) {
        // Save operations ..
        return "order-view";
    }
}

4. Здесь клиенты и товары поступают из вашей базы данных.

Кнопка «Отправить форму» будет отправлять идентификаторы объектов для выбора здесь методу insertOrder. (Вы можете аналогичным образом дублировать другие поля, и я рекомендую вам изучить пример в этой ссылке, чтобы динамически дублировать эту область выбора продукта.)

<!DOCTYPE HTML>
<html lang = "en" xmlns:th = "http://www.thymeleaf.org">
<body>
<div>
    <form action = "/order/insert" method = "post" th:object = "${order}">
        <p>
            <label>Select Customer</label>
        </p>
        <p>
            <select name = "customer.id">
                <option th:each = "customer : ${customers}"
                        th:value = "${customer.id}"
                        th:text = "${customer.name}">Customer Name</option>
            </select>
        </p>
        <p>
            <label>Select Product</label>
        </p>
        <p>
            <select name = "orderItems[0].product.id">
                <option th:each = "product : ${products}"
                        th:value = "${product.id}"
                        th:text = "${product.name}">Product Name</option>
            </select>
            <input type = "text" name = "orderItems[0].quantity" />
        </p>
        <button type = "submit">Submit Form</button>
    </form>
</div>
</body>
</html>

Я рекомендую вам прочитать этот пример, в котором есть место для необходимой библиотеки и настроек Spring.

Большое спасибо! Это было действительно полезно!

jakablevente 30.12.2020 12:58

Другие вопросы по теме