Сценарий
Таблицы SQL-сервера
Классы сущностей
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;
}
}
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;
}
}
Модель_Продукты
@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;
}
}
Описание проблемы
В этих классах сущностей я использовал сопоставление «многие к одному» во всех трех классах. Мой сценарий, упомянутый выше, - многие ко многим. В одном заказе может быть несколько товаров, одновременно один товар размещается во многих заказах.
Моя проблема заключается в использовании идентификатора заказа, мне нужно получить все сведения о продукте. Точно так же, используя идентификатор продукта, мне нужно получить все детали заказа. Я думаю использовать сопоставление «один ко многим» в классе сущностей порядка, но я не знаю, как его сопоставить. Это правильный путь?




В вашем коде цель 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 с обоими столбцами идентификаторов. И вы сможете получить все заказы на один товар и все товары в одном заказе.
Нужно ли мне удалить класс сущности сведений о заказе? Мне нужно внести какие-либо изменения в сведения о заказе??
Класс сущности OrderDetail не требуется. Hibernate автоматически создаст таблицу TBL_ORDER_DETAILS. Что касается исключения LazyInitializationException, попробуйте добавить fetch = FetchType.EAGER к обеим аннотациям @ManyToMany.
Я добавил fetch = FetchType.EAGER к обоим, он выдает ошибку [GET localhost:8080/RentdIn/GetAllRentdUser?isSupername=admin net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)] в консоли браузера и ошибку переполнения стека в консоли eclipse.
Garima, Учтите это, у меня есть таблица пользователей, таблица отделов и таблица сопоставления, где один пользователь может быть частью многих отделов, а в одном отделе много пользователей - это концепция. Моя проблема в том, что у меня есть 2 класса сущностей для отдела и пользователя соответственно. Мне нужно выполнить следующие операции одну за другой: 1) зарегистрировать пользователя, 2) зарегистрировать отдел, 3) просмотреть все зарегистрированные отделы, 4) просмотреть всех зарегистрированных пользователей, 5) выбрать конкретного пользователя и просмотреть, какие отделы он зарегистрировал, и 6) выберите конкретный отдел и просмотрите всех пользователей в этом отделе.
Теперь перейдем к проблеме, когда я пытаюсь получить весь список пользователей, аннотация объекта «многие ко многим» в пользовательском классе выдает ошибку. Мне действительно нужно разъяснение, как выполнять операцию и какими могут быть мои классы сущностей.
Получить информацию о продукте определенного заказа.
Создайте двунаправленное сопоставление 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, не удалось инициализировать прокси — нет сеанса
Нужно ли мне удалить класс сущности сведений о заказе? Мне нужно внести какие-либо изменения в сведения о заказе??
Когда я пытаюсь это сделать, у меня возникает ошибка: org.hibernate.LazyInitializationException: не удалось лениво инициализировать набор ролей: rentd.model.Order.ordersDetail, не удалось инициализировать прокси - нет сеанса