java - 如何创建多对多连接,其中所有者实体可以拥有多个拥有的实体?

标签 java spring jpa

我需要三个实体 - 用户、订单和产品。订单里面可以有多个产品,产品也可以在多个订单中。但在一份订单中我们可以拥有多种类似的产品。如何使用hibernate来组织它?

我认为其中一种方法是创建另一个实体 - OrderProducts,但是我需要使用什么映射?或者还有另一种简单的方法吗?

订单.java

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private Date date;

    @ManyToOne
    private User user;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "Order_Products",
            joinColumns = @JoinColumn(name = "order_id"),
            inverseJoinColumns = @JoinColumn(name = "product_id")
    )
    private List<Product> products;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }

    public Order() {
    }
}

产品.java

@Entity
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    private String name;

    private float price;

    @ManyToMany(mappedBy = "products")
    private List<Order> orders = new LinkedList<>();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

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

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

    public void addOrder(Order order){
        orders.add(order);
    }
}

我需要 order_products 表来包含数量列,但我不知道如何实现。

Hibernate: create table order_products (order_id int4 not null, product_id int4 not null)
Hibernate: create table orders (id int4 not null, date date, user_id int4, primary key (id))
Hibernate: create table product (id int4 not null, name varchar(255), price float4 not null, primary key (id))
Hibernate: create table users (id int4 not null, fullname varchar(255), primary key (id))

最佳答案

让我们首先正确命名这个新实体:OrderedProduct

一个订单可以包含多少个订购的产品?一个,还是几个?几个,对吗?

因此,OrderOrderedProduct 之间的关联将是 XxxToMany。是 OneToMany 还是 ManyToMany

嗯,OrderedProduct 包含为一个特定订单订购的产品数量,对吗?它的表包含一个订单的ID,对吗?因此它与一个特定订单相关联。因此关联只能是 OneToMany

关于java - 如何创建多对多连接,其中所有者实体可以拥有多个拥有的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744788/

相关文章:

java - 如何将表名传递给 SELECT COUNT 查询中的准备语句?

java - Spring 底座拦截器 : Get Controller & Method Name

java - Spring-data-jpa NativeQuery 具有两个输出参数

java - 如何在可执行 jar 文件中使用 JPA?

spring - 在 Spring JPA 中设置表名

java - 如何在java二叉树中实现通用的中序遍历?

java - 触发谷歌眼镜上的相机

java - 实现的接口(interface)是否被视为实现的父类(super class)?

java - 如何使用 @Assisted 将 bean "with additional parameters"从 Guice 迁移到 Spring?

java - 带有命名查询的 JPA Criteria API