【发布时间】:2020-01-27 05:05:16
【问题描述】:
我想在表之间创建如下关系
表格 -
- 所有者 - 所有者表包含有关所有者的详细信息。
-
DietPlans - DietPlans 表包含所有者可以创建的所有饮食计划。所有者可以创建
n数量的饮食计划,但每个饮食计划都属于一个所有者。因此,它是1到n的关系或一对多关系。 -
客户 - 客户基本上是一个消费饮食计划的实体。换句话说,我希望客户订阅已经存在的饮食计划。因此,我的理解是,客户订阅饮食计划将是多对一的关系。
n客户数量可以订阅n饮食计划数量,反之亦然。 客户还与所有者建立多对一关系。
所以,为了实现这种关系,我有两种方法。我想知道哪一种效果更好。
方法 1
在这种方法中,DietPlans 表将与Owner 表具有OneToMany 关系,并与客户表具有ManyToMany 关系。
Owner-
@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>();
}
Customer 表-
@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>();
}
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 表将与客户表具有多对一关系。这样,客户就不会订阅不存在的计划。
就简单性而言,这两个中哪一个更好?另外,如果有更好的建模方法,请告诉我。
【问题讨论】:
-
您能否澄清一下 - 一位客户可以同时订阅多个饮食计划吗?或者他可以一次制定一个饮食计划?
-
嗨@YogeshBadke 一位顾客可以有多种饮食计划。一个饮食计划可以被多个客户订阅。 N:N 关系
标签: java database hibernate spring-data-jpa entity-relationship