现实世界中事物内部以及事物之间的联系在信息世界中反映为实体内部的联系和实体之间的联系。实体间联系可分为:一对一联系(1:1);一对多联系(1:n);多对多联系(m:n)。
一对一联系(1:1)定义:如果对于实体集A中的每一个实体,实体集B中至多有一个(也可以没有)实体与之联系,反之亦然,则称实体集A与实体集B具有一对一联系,记为1:1。实例:一个班级只有一个正班长。一个正班长只在一个班中任职。
实体一对一关联:
假如数据库中已经存在USER、PERSON表,并且User、Person已经设计成实体类,则User类与Person类可以映射成为一对一关联关系。
Hibernate一对一关联关系映射:
Hibernate提供两种映射一对一关联关系的方式:
主键关联映射;唯一外键关联映射(外键必须设定unique约束)。
主键关联映射–主键表(USER)。通过
唯一外键关联映射-外键表(USER)。通过
唯一外键关联映射-主键表(PERSON)。通过
在User一端的person属性上配置。@OneToOne(cascade=CascadeType.ALL):指定一对一关联关系,并设置级联属性。@PrimaryKeyJoinColumn(name="ID"):指定PERSON表主键列名。在Person一端的id属性上配置主键生成策略为foreign。@GeneratedValue(generator="foreign")@GenericGenerator(name="foreign",strategy="foreign",parameters={@Parameter(name="property",value="user")})在Person一端的user属性上配置一对一关联关系。@OneToOne(mappedBy="person")使用注解映射唯一外键关联的一对一:
在User一端的person属性上配置。@OneToOne(cascade=CascadeType.ALL)@JoinColumn(name="PERSONID"):指明USER表中的外键列名。在Person一端的user属性上配置。@OneToOne(mappedBy="person")2.组合关系映射
publicclassContact{privateintid;privateStringphoneNum;privateStringemail;privateAddresshomeAddress;privateAddressworkAddress;……}publicclassAddress{privateStringprovince;//省privateStringcity;//市privateStringdistrict;//区privateStringdetail;//详细地址……}数据库设计的重要原则:在不导致数据冗余的情况下,要尽量减少数据库表的数目以及库表之间的外键参照关系。
在部分类(Address)端配置。@Embeddable:指明为嵌入式类,不需要单独进行映射。@EmbeddablepublicclassAddress{......}在整体类(Contact)端的homeAddress配置。@Embedded@AttributeOverrides(value={@AttributeOverride(name="province",column=@Column(name="WORKPROVINCE")),@AttributeOverride(name="city",column=@Column(name="WORKCITY")),......})