使用hibernate的场景的实体类

问题描述 投票:0回答:2

脚本

  1. 获取特定订单的产品详细信息。
  2. 获取特定产品的订单详细信息。

SQL服务器表

  1. Table_Orders
  2. Table_OrderDetails
  3. Table_Products

实体类

  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. Model_Products @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; } }

问题描述

在这个实体类中,我在所有三个类中使用了多对一映射。我上面提到的场景很多。一个订单可以有多个产品,同时一个产品可以放在许多订单中。

我的问题是使用订单ID我需要获取所有产品详细信息。同样使用产品ID我需要获取所有订单详细信息。我想在细节实体类中使用一对多映射,但我不知道如何映射它。这是正确的方法吗?

java hibernate entity hibernate-mapping hibernate-criteria
2个回答
0
投票

在您的代码中,Table_OrderDetails的目的只是在Order_ID和Product_ID之间创建一个映射。因此,不应将其创建为分离的“实体”。应该使用Hibernates @ManyToMany。

order.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;
    }
}

product master.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;
    }
}

这将自动创建包含Id列的第三个表'Tbl_OrderDetails'。您将能够获得一个产品的所有订单,以及一个订单中的所有产品。


0
投票

获取特定订单的产品详细信息。

创建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;
© www.soinside.com 2019 - 2024. All rights reserved.