当前位置: 首页 > 知识库问答 >
问题:

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

黄流觞
2023-03-14

我需要三个实体——用户、订单和产品。订单可以有多个产品,产品可以有多个订单。但是在一个订单中,我们可以有几个相似的产品。如何使用Hibernate来组织它?

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

Order.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))

共有2个答案

颜新
2023-03-14

这里是订单行实体的一个示例。我建议在其中添加数量字段。它可以包含一些额外字段,如产品价格或折扣等。。

@Entity
@Table(name = "order_row")
public class OrderRow {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    int id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "order_id", nullable = false)
    Order order;

    @ManyToOne(optional = false)
    @JoinColumn(nullable = false, name = "product_id")
    Product product;

    @Column(name = "quantity", nullable = false)
    Integer quantity;
}

我建议使用fetch=FetchType。在每个@一个域和@多个域注释中

现在,您可以编辑订单实体添加订单行字段

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

  @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = 
  FetchType.LAZY)
  Set<OrderRow> orderRows = new HashSet<>();

  // getters, setters
}
陆啸
2023-03-14

让我们从正确命名这个新实体开始:OrderedProducts

一份订单可以包含多少订购产品?一个,还是几个?好几个,对吧?

因此,订单和订购产品之间的关联将是一个xxx域。它是一个多域还是多域?

好吧,OrderedProducts包含为一个特定订单订购的产品数量,对吗?它的表包含一个订单的ID,对吗?所以它链接到一个特定订单。所以关联只能是一个OneTo众多

 类似资料:
  • 我正在尝试使用JPA注释设计我的实体类。 我正在努力做的是: 具有 ID、***电子邮件、密码、activation_key、active、role***的用户表 和许多类型的用户表。 student_table user_id第一名最后一名公司地址等 MENTOR user_id第一名最后一名DOB部门等 当用户注册时,根据他们的角色,他们将被分为两个表(用户、导师/学生) 当它们登录时,Man

  • 问题内容: 我们可以在Android中拥有服务的多个实例吗?我想要一种可以在特定时间使手机静音的服务,并且我想重新使用该服务以使手机在特定时间处于振动模式。因此,基本上,如果我可以使该服务多次运行,则无需创建其他服务即可将手机设置为振动模式。另外,如果我们可以运行多个实例,请说明如何停止它。任何代码提示都会有很大帮助。 问题答案: 我们可以在Android中拥有服务的多个实例吗? 不能。您可以具有

  • 房间类别 长话短说,这一点是为了添加房间,并能够导航它们,捡起物品,然后放下它们。在我尝试运行程序时,我注意到我不能有多个北/南/东/西键。我怎样才能避开这件事,这样我才能把它做好?

  • 我用uWSGI运行一个烧瓶服务器。进程由System d启动。 现在我需要一些以“while(True)”运行的子流程,它们必须始终收集一些信息。 我现在开始一个具有多重处理的子过程。 下面是我的一些代码: 然后我用systemd重新启动/停止uWSGI,进程阻塞,当然它不受SIG影响。 我的第一个想法是实现一个单音句柄: 但不幸的是,他们没有点火。。。 如果服务器即将关闭,是否会触发事件,或者我

  • 我试图理解javax.persistence注释@onetoone、@manytoone和@manytomany。这些注释的描述提到了。具体来说: [@OneToOne]:如果关系是双向的,则非拥有方必须使用OneToOne注释的mappedBy元素来指定拥有方的关系字段或属性。 [@manytoone]:如果关系是双向的,那么非所有者OneToMany实体端必须使用mappedBy元素来指定作为

  • 我在读下面的文章: 然而,student实体是用mappedBy注释的,我知道任何用mappedBy注释的实体都是相反的一面。谁能解释一下这个吗? 2-哪个ID是外键?@PrimaryKeyJoinColumn在Address实体中使用,这意味着地址Id是主键和外键吗?在下面的文章中,它们有相同的示例,但它是单向的: http://websystique.com/hibernate/hiberna