首先讲一下概念:
- 关联关系指:实体之间的关系,即在对象模型中就是一个或多个引用;
- 关联映射指:指将关联关系映射到数据库中,即实体到数据库表的映射,通过
<class>
标签映射
实体设计原则:
- 实现无参的默认的构造函数
- 提供一个标识
- 建议不要使用final修饰实体类(因为要往数据库中添加数据,很可能要改变值,如果用final修饰,就无法改变了)
- 建议为实体类生成getter和setter方法
注意:实体类的名称或实体类中的属性的名称和数据库关键字重复时,会出现问题,可用table属性和column属性进行重新命名
有两种策略可实现一对一的关联映射,分别为主键关联和唯一外键关联
主键关联 |
主键关联:即让两个对象具有相同主键值,以表明它们之间的一 一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
单向关联
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<one-to-one name="idCard" constrained="true" />
</class>
对端
<class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
</class>
- class设置为foreign表明主键采用的是使用另外一个相关联的对象(根据idCard的类型找到另一张表,从而找到对端的主键)的主键作为该对象主键
- one-to-one指示hibernate加载关联对象的方式,不会生成多余的字段,即在t_person表中不会有idCard字段
- constrained=”true”表明当前主键是其关联对象的主键,即形成了外键约束条件
- Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo
双向关联
<class name="com.bjpowernode.hibernate.Person" table="t_person""/>
<id name="id">
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<one-to-one name="idCard" constrained="true" />
</class>
对端
即多添加了一个one-to-one标签
<class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
<one-to-one name="person" />
</class>
Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo,person(多了一个person)
注:
1>one-to-one不会生成多余的字段;
2>因为一段的主键是从对端获取的,所以在保存维护关系的一端时,会自动保存对象,不用手动保存
最后映射的表是这样的:
唯一外键关联 |
唯一外键关联:外键关联,本来是用于多对一的配置,但是如果在外键上加上唯一的限制之后,也可用来表示一对一关联关系
单向关联
利用many-to-one,只是设置外键字段唯一unique=”true”
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<many-to-one name="idCard" unique="true" />
</class>
对端
<class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
</class>
双向关联
<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<many-to-one name="idCard" unique="true" />
</class>
对端
即多添加了一个one-to-one标签, property-ref=”idCard”表明被关联字段为idCard,被关联实体主键作为关联字段
<class name="com.bjpowernode.hibernate.IdCard" table="t_IdCard">
<id name="id">
<generator class="native" />
</id>
<property name="cardNo" />
<one-to-one name="person" property-ref="idCard"></one-to-one>
</class>
Person实体类中有字段id,name,idCard;IdCard实体类中有字段id,cardNo
注:
1>many-to-one会生成多余的字段;
2>实体类之间映射时,一段是持有另一端的对象,而普通的实体关联是加一个string或int等的属性即可
最后映射的表是这样的: