【问题标题】:How to map two entities through an associate link entity如何通过关联链接实体映射两个实体
【发布时间】:2015-05-31 06:59:06
【问题描述】:

我需要记录他们所在城市的各种业务及其在每个城市的分支机构。每个企业可能在不同的城市,每个城市可能有不同的分支机构。

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

我想分支表应该有连接表的两个主键的 branchid 和外键。通过这种方式,我可以确保没有一个分支机构与多个城市和企业的组合相关联。

 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 不,还有其他一些限制使它像这样。此外,机构是举办课程的地方,每个课程和学生的组合可以有多个机构。
  • 您确定需要 Business_city 的连接表吗?您可以从 Branch Table 中获取相同的数据.. 不需要 business_city 表..
  • @user1354678 我需要这个想象我只需要知道哪些企业在纽约市。
  • 这就是为什么我说只需要分支表,因为您可以从分支表中获取相同的信息。对于这种情况 - need to know which businesses are in NYC only ,您可以使用此查询 select business from branchTable where city='?' group by business

标签: java mysql hibernate hibernate-mapping


【解决方案1】:

你的映射应该是这样的:

@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;
}

这个中间实体映射是better than using a @ManyToMany 关联,它可能会生成一些效率较低的 SQL 查询,并且不允许您向链接表添加一些额外的列。

【讨论】:

  • 感谢您的回答,是否意味着每个城市只能有一个企业?
  • 否,如样本数据中说明的业务1和业务2都在A市。每个业务可以在多个城市,每个城市可以有多个分支机构。每个城市可以有多个企业,每个企业可以有多个分支机构。
  • 好的。我删除了约束。现在,它允许您拥有任意数量的业务和分支机构。
  • 谢谢,我需要等待 20 小时才能获得赏金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多