Я хочу сделать форму заказа с весенней загрузкой, где я могу сохранить заказ с большим количеством позиций заказа. Я не знаю, как реализовать для этого сервис, класс и даже страницу тимелеафа. Любая подсказка будет здорово! Вот фото, что я хочу сделать
Вот мои два класса сущностей (без геттеров и сеттеров и клиента для краткости)
@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;
Вам просто нужно создать репозиторий, сервис и контроллер.
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.
Большое спасибо! Это было действительно полезно!