Класс сущностей для сценария с использованием гибернации

Сценарий

  1. Получить информацию о продукте определенного заказа.
  2. Получить информацию о заказе конкретного продукта.

Таблицы SQL-сервера

  1. Таблица_Заказы
  2. Table_OrderDetails
  3. Таблица_Продукты

Классы сущностей

  1. Model_orders

    @Entity
    @Table(name = "Tbl_Orders")
    public class Order
    {
        public Order() {
        }
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name = "Order_ID")
        private Long orderId;
    
        @Column(name = "OrderNo")
        private String orderNumber;
    
        @Column(name = "OrderDate")
        private Date orderDate;
    
        @ManyToOne()
        @JoinColumn(name = "User_ID")
        private Customer customerOrder;
    
    
    
        public Long getOrderId() {
            return orderId;
        }
    
        public void setOrderId(Long orderId) {
            this.orderId = orderId;
        }
    
        public String getOrderNumber() {
            return orderNumber;
        }
    
        public void setOrderNumber(String orderNumber) {
            this.orderNumber = orderNumber;
        }
    
        public Date getOrderDate() {
            return orderDate;
        }
    
        public void setOrderDate(Date orderDate) {
            this.orderDate = orderDate;
        }
    
        public Customer getCustomerOrder() {
            return customerOrder;
        }
    
        public void setCustomerOrder(Customer customerOrder) {
            this.customerOrder = customerOrder;
        }
    }
    
  2. Model_OrderDetails

    @Entity
    @Table(name = "Tbl_OrderDetails")
    public class OrderDetail {
    
        public OrderDetail() {
            super();
        }
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "OrderDetail_ID")
        private Long orderDetailsId;
    
        @ManyToOne
        @JoinColumn(name = "Order_ID")
        private Order orderId;
    
        @ManyToOne
        @JoinColumn(name = "Product_ID")
        private ProductMaster product;
    
    
        public Long getOrderDetailsId() {
            return orderDetailsId;
        }
    
        public void setOrderDetailsId(Long orderDetailsId) {
            this.orderDetailsId = orderDetailsId;
        }
    
        public Order getOrderId() {
            return orderId;
        }
    
        public void setOrderId(Order orderId) {
            this.orderId = orderId;
        }
    
    
    
        public ProductMaster getProduct() {
            return product;
        }
    
        public void setProduct(ProductMaster product) {
            this.product = product;
        }
    }
    
  3. Модель_Продукты

    @Entity
    @Table (name = "Tbl_Products")
    public class ProductMaster
    {
        public Products() {
        }
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column (name = "Product_ID")
        @Field(index= Index.YES, analyze= Analyze.YES, store= Store.YES)
        private Long productId;
    
        @Column (name = "Product_Code")
        private String productCode;
    
        @Column (name = "Product_Name")
        @Field(index= Index.YES, analyze= Analyze.YES, store= Store.YES  ,analyzer=@Analyzer(definition = "customanalyzer"))
        private String productName;
    
    
    
        public Long getProductId() {
            return productId;
        }
    
        public void setProductId(Long productId) {
            this.productId = productId;
        }
    
    
        public String getProductCode() {
            return productCode;
        }
    
        public void setProductCode(String productCode) {
            this.productCode = productCode;
        }
    
        public String getProductName() {
            return productName;
        }
    
        public void setProductName(String productName) {
            this.productName = productName;
        }
    }
    

Описание проблемы

В этих классах сущностей я использовал сопоставление «многие к одному» во всех трех классах. Мой сценарий, упомянутый выше, - многие ко многим. В одном заказе может быть несколько товаров, одновременно один товар размещается во многих заказах.

Моя проблема заключается в использовании идентификатора заказа, мне нужно получить все сведения о продукте. Точно так же, используя идентификатор продукта, мне нужно получить все детали заказа. Я думаю использовать сопоставление «один ко многим» в классе сущностей порядка, но я не знаю, как его сопоставить. Это правильный путь?

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

Ответы 2

В вашем коде цель Table_OrderDetails — просто создать сопоставление между Order_ID и Product_ID. Так что это не должно быть создано как отдельная «сущность». Вместо этого следует использовать Hibernates @ManyToMany.

Заказ.java

import javax.persistence.*;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "Tbl_Orders")
public class Order
{
    public Order() {
    }
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "Order_ID")
    private Long orderId;

    @Column(name = "OrderNo")
    private String orderNumber;

    @Column(name = "OrderDate")
    private Date orderDate;

    @ManyToMany
    @JoinTable(name = "Tbl_OrderDetails",
            joinColumns = @JoinColumn(name = "Order_ID"),
            inverseJoinColumns = @JoinColumn(name = "Product_ID"))
    private List<ProductMaster> productMasters = new ArrayList<>();

    public Long getOrderId() {
        return orderId;
    }

    public void setOrderId(Long orderId) {
        this.orderId = orderId;
    }

    public String getOrderNumber() {
        return orderNumber;
    }

    public void setOrderNumber(String orderNumber) {
        this.orderNumber = orderNumber;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public List<ProductMaster> getProductMasters() {
        return productMasters;
    }

    public void setProductMasters(List<ProductMaster> productMasters) {
        this.productMasters = productMasters;
    }
}

ПродуктМастер.java

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "Tbl_Products")
public class ProductMaster
{
    public ProductMaster() {
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column (name = "Product_ID")
    private Long productId;

    @Column (name = "Product_Code")
    private String productCode;

    @Column (name = "Product_Name")
    private String productName;

    @ManyToMany(mappedBy = "productMasters")
    private List<Order> orders = new ArrayList<>();

    public Long getProductId() {
        return productId;
    }

    public void setProductId(Long productId) {
        this.productId = productId;
    }


    public String getProductCode() {
        return productCode;
    }

    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}

Это автоматически создаст третью таблицу Tbl_OrderDetails с обоими столбцами идентификаторов. И вы сможете получить все заказы на один товар и все товары в одном заказе.

Когда я пытаюсь это сделать, у меня возникает ошибка: org.hibernate.LazyInitializationException: не удалось лениво инициализировать набор ролей: rentd.model.Order.ordersDetail, не удалось инициализировать прокси - нет сеанса

Santhosh M 15.03.2019 06:10

Нужно ли мне удалить класс сущности сведений о заказе? Мне нужно внести какие-либо изменения в сведения о заказе??

Santhosh M 15.03.2019 06:31

Класс сущности OrderDetail не требуется. Hibernate автоматически создаст таблицу TBL_ORDER_DETAILS. Что касается исключения LazyInitializationException, попробуйте добавить fetch = FetchType.EAGER к обеим аннотациям @ManyToMany.

Garima 15.03.2019 10:16

Я добавил fetch = FetchType.EAGER к обоим, он выдает ошибку [GET localhost:8080/RentdIn/GetAllRentdUser?isSupername=admin net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)] в консоли браузера и ошибку переполнения стека в консоли eclipse.

Santhosh M 15.03.2019 11:52

Garima, Учтите это, у меня есть таблица пользователей, таблица отделов и таблица сопоставления, где один пользователь может быть частью многих отделов, а в одном отделе много пользователей - это концепция. Моя проблема в том, что у меня есть 2 класса сущностей для отдела и пользователя соответственно. Мне нужно выполнить следующие операции одну за другой: 1) зарегистрировать пользователя, 2) зарегистрировать отдел, 3) просмотреть все зарегистрированные отделы, 4) просмотреть всех зарегистрированных пользователей, 5) выбрать конкретного пользователя и просмотреть, какие отделы он зарегистрировал, и 6) выберите конкретный отдел и просмотрите всех пользователей в этом отделе.

Santhosh M 15.03.2019 12:08

Теперь перейдем к проблеме, когда я пытаюсь получить весь список пользователей, аннотация объекта «многие ко многим» в пользовательском классе выдает ошибку. Мне действительно нужно разъяснение, как выполнять операцию и какими могут быть мои классы сущностей.

Santhosh M 15.03.2019 12:08

Получить информацию о продукте определенного заказа.

Создайте двунаправленное сопоставление Order с OrderDetail.

Into Order:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "orderId", fetch = FetchType.LAZY)
private Collection<OrderDetail> ordersDetail;

Получить информацию о заказе конкретного продукта.

Создайте двунаправленное сопоставление ProductMaster и OrderDetail.

Into ProductMaster:
@OneToMany(cascade = CascadeType.ALL, mappedBy = "product", fetch = FetchType.LAZY)
private Collection<OrderDetail> ordersDetail;

Когда я пытаюсь это сделать, у меня возникает такая же ошибка: org.hibernate.LazyInitializationException: не удалось лениво инициализировать набор ролей: rentd.model.Order.ordersDetail, не удалось инициализировать прокси — нет сеанса

Santhosh M 15.03.2019 06:11

Нужно ли мне удалить класс сущности сведений о заказе? Мне нужно внести какие-либо изменения в сведения о заказе??

Santhosh M 15.03.2019 06:31

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