如何通过关联链接实体将两个实体进行映射

3

我需要记录各种企业的城市和每个城市的分支机构。每个企业可能位于不同的城市,在每个城市中可能有不同的分支机构。

以银行为例。它可能在A和B两个城市,而在A市可能有两个分支机构,在B市只有一个。

我想分支表应该具有分支id和联接表的两个主键的外键。这样我就可以确保没有分支将与多个城市和企业组合相关联。

 Business       City
     \          /
  BusinessID CityID    <<join table has primary keys of Business and City tables
          |
        Branch
BranchID BusinessID CityID

示例数据

Business Table          
1         
2       
3        

City Table
A
B
C

Join Table
Business_City
1         A
1         B
2         A
3         C

Branch Table
Business City   Branch
1          A      I1
1          A      I2
1          B      I6
2          A      I5
3          C      I3

如您所见,企业1和2都在A市。企业1在A市有两个分支机构,而企业2只有一个分支机构等。

我应该如何将分支机构映射到企业和城市?


机构和课程不应该关联吗? - MadProgrammer
1
@MadProgrammer 不是这样的,还有其他一些限制条件。此外,机构是课程将被举办的地方,每个课程和学生的组合都可以有许多机构。 - Daniel Newtown
你确定你需要一个 Business_city 的连接表吗?你可以从 Branch 表中获取相同的数据。不需要 business_city 表。 - The Coder
1
@user1354678 我只需要知道哪些企业在纽约市,不需要图片。 - Daniel Newtown
这就是为什么我说只需要分支表,因为你可以从分支表中获取相同的信息。对于这种情况——“只需知道哪些企业在纽约”,您可以使用此查询“select business from branchTable where city='?' group by business”。 - The Coder
1个回答

2
这是你的映射应该看起来的样子:
@Entity
public class Business {
    @Id
    private Long id;

    @OneToMany(mappedBy = "business")
    private Set<Branch> branches = new HashSet<>();
}

@Entity
public class City {
    @Id
    private Long id;

    @OneToMany(mappedBy = "city")
    private Set<Branch> branches = new HashSet<>();
}

@Entity
public class Branch {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(name = "business_id")
    private Business business;

    @ManyToOne
    @JoinColumn(name = "city_id")
    private City city;
}

这种中间实体映射 比使用@ManyToMany关联更好,因为后者可能会生成一些效率较低的SQL查询,并且不允许您向链接表添加其他列。

1
谢谢您的回答,这是否意味着每个城市只能有一个企业? - Daniel Newtown
1
不,正如示例数据所解释的那样,业务1和2都在A市。每个业务可以在多个城市中,每个城市中可以有多个分支机构。每个城市中可以有多个业务,并且每个业务可以有多个分支机构。 - Daniel Newtown
好的。我已经移除了限制。现在它允许您拥有任意数量的业务和分支机构。 - Vlad Mihalcea
1
谢谢,我需要等待20个小时才能颁发悬赏。 - Daniel Newtown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接