Java 如何在Hibernate中对同一个表上的多通和多通关系建模?

Java 如何在Hibernate中对同一个表上的多通和多通关系建模?,java,database,hibernate,spring-data-jpa,entity-relationship,Java,Database,Hibernate,Spring Data Jpa,Entity Relationship,我想在表之间创建以下关系 桌子- 所有者-所有者表包含有关所有者的详细信息。 DietPlans-DietPlans表包含所有者可以创建的所有饮食计划。一个所有者可以创建n个节食计划,但每个节食计划都属于一个所有者。因此,它是1对n关系或一对多关系。 客户-客户基本上是一个消费饮食计划的实体。换句话说,我希望顾客订阅已经存在的饮食计划。因此,我的理解是,客户订阅饮食计划将是一种多对一的关系。n个客户可以订阅n个饮食计划,反之亦然。 客户与所有者之间也存在多对一关系。 因此,为了实现这种关系,我有

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

桌子-

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

方法1 在这种方法中,DietPlans表与Owner表具有一对多关系,与Customer表具有多对多关系

所有者-

饮食计划如下-

@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 在这种方法中,我将创建一个单独的SubscribedPlans表,其中包含来自dietPlans表的引用外键,而不是在dietPlans表和Customer表之间建立多对多关系。SubscribedPlans表将与Customer表具有多对一关系。这样,客户就无法订阅不存在的计划


就简单性而言,这两个选项中哪一个更好?另外,如果有更好的建模方法,请让我知道。

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

您是否看到需要投入更多资金的即时需求 用户订阅计划的数据?比如说 已订阅计划的有效期,该计划的定价 计划等

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


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

您能否澄清这一点?一个客户能否同时订阅多个饮食计划?或者他一次可以有一个饮食计划?Hi@YogeshBadke一个客户可以有多个饮食计划。一个饮食计划可以由多个客户订阅。N:关系谢谢。Hibernate不是在内部为多对多映射创建单独的表吗?我可以不在生成的表中存储定价、持续时间等详细信息吗?如果它的简单M2M映射只包含2列,hibernate会自动管理它。如果您想拥有更多的列,您需要通过使其成为单独的实体来自行管理它。
   @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>();

}