为什么@JoinColumn位于父级,而产生的列位于子级?

时间:2019-07-12 05:21:54

标签: java hibernate

嗨,我对这里的实体关系感到困惑:

class Country{
        @Id
        @Column(name="conId")
        private int id;         
    @Column(name="name")    
        private String name;
        @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)   @JoinColumn(name="countryId")   
        private Set<a_1_State_lazy> states;
            }

class State{
@Id         
@Column(name = "stateId")       
private int id;         
@Column(name = "name")  
private String name;    
        @Column(name="countyId")        
private int countryId;

    }

当您坚持使用这些实体时。它产生这张表

Country

  • conId

  • 名称

State

-stateId

-名称

-countryId

我在这里的困惑是 Country是父实体,State是子实体(其中有一个countryId链接到父实体的ID)。

class Country{
   @Id
   @Column(name="id")
    private int id;          
   @Column(name="name")
   private String name;
   @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)     
   @JoinColumn(name="countryId")
   private Set<a_1_State_lazy> states;
    }

(根据我的有限理解)应该输出:

Country: -conId - 名称 -stateId

相反,它构造了一个包含以下内容的表:

Country

  • conId

  • 名称

因此缺少此“ stateId”。并在State表中创建“ conId”,即:

State

-stateId

-名称

  • countryId

Contry表为什么不包含“ stateId”?而是在State表中创建“ countryId”?

1 个答案:

答案 0 :(得分:1)

这是由于从您的实体生成的架构满足数据库的第一种普通形式的事实:所有列都必须包含原子值(First normal form (1NF))。

因此,该信息已被移至“一对多”关系的“许多”侧,而不是包含该国家/地区中每个州的所有ID的states列。