gpt4 book ai didi

java - 如何在 Hibernate 中的同一个表上建模 ManyToOne 和 ManyToMany 关系?

转载 作者:行者123 更新时间:2023-12-02 09:04:27 25 4
gpt4 key购买 nike

我想在表之间创建以下关系

表格 -

  • 所有者 - 所有者表包含有关所有者的详细信息。
  • 饮食计划 - DietPlans 表包含所有者可以创建的所有饮食计划。所有者可以创建n 个饮食计划,但每个饮食计划都属于单个所有者。因此,它是 1n 关系或一对多。
  • 客户 - 客户基本上是消费饮食计划的实体。换句话说,我希望顾客订阅已经存在的饮食计划。因此,我的理解是,客户订阅饮食计划将是多对一的关系。 n 个客户可以订阅 n 个饮食计划,反之亦然。客户与所有者也存在多对一的关系。

因此,为了实现这种关系,我有两种方法。我想知道哪一个效果更好。

方法 1在此方法中,DietPlans 表将与 Owner 表建立 OneToMany 关系,并与 Customer 表建立 ManyToMany 关系。

所有者 -

@Data
@Entity
public class Owner {

@EmbeddedId
private OwnerKey ownerId;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Customer> customers= new ArrayList<Customer>();


@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Diet> dietPlans = new ArrayList<Diet>();
}

客户表 -

   @Data
@Entity
public class Customer{

@EmbeddedId
private CustomerKey customerId;

@ManyToOne(fetch = FetchType.LAZY, optional= false)
private Owner owner;

@ManyToMany(fetch = FetchType.LAZY, mappedBy = "subscribedCustomers")
private List<Diet> subscribedDietPlans = new ArrayList<Diet>();
}

饮食计划如下 -

@Data
@Entity
public class Diet {

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


@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn(.....
})
private Owner owner;

@ManyToMany(fetch = FetchType.LAZY, optional = false)
@JoinColumns({
@JoinColumn.....)
})
private List<Customer> subscribedCustomers = new ArrayList<Customer>();

}

不应允许客户创建任何饮食计划,而应仅订阅由其所有者创建的饮食计划。

方法 2在这种方法中,我不会在 DietPlans 表和 Customer 表之间建立多对多关系,而是创建一个单独的 SubscribedPlans 表,其中包含来自 DietPlans 的引用(外键) 表。 SubscribedPlans 表将与 Customer 表具有多对一关系。这样,客户就无法订阅不存在的计划。

就简单性而言,两者中哪一个更好?另外,如果有更好的方法来进行此建模,请告诉我。

最佳答案

您的问题的答案将取决于以下问题的答案

Do you see an immediate requirement where you would need to put more data against the user's subscribed plan? For example, say, the duration for which subscribed plan will be active, pricing for the plan etc.

如果答案是否定的,那么您只需要维护映射即可。在这种情况下,方法 1 效果更好。

如果答案是肯定的,那么您需要采用方法 2。因为 SubscribedPlan 实体将不断发展并包含用户订阅计划的相关详细信息,例如持续时间、价格(它将是价格计划表)等

关于java - 如何在 Hibernate 中的同一个表上建模 ManyToOne 和 ManyToMany 关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com