三大框架SSH成长路程(五)
来源:互联网 发布:淘宝银泰百货是正品吗 编辑:程序博客网 时间:2024/04/29 16:33
映射原理
两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。我们看一下这个例子的对象模型,如下图所示:
对象模型
从上图中可以看出:
1、一个人只有一张身份证,唯一的一个身份证号,对象之间是一对一的关系;
2、人(Person)持有身份证(IdCard)的引用,所以,两个对象关系维护由person端决定。
从对象模型映射成关系模型,有两种方式:主键关联和唯一外键关联,我们继续看下面的内容。
分类:
主键关联:
1、两个实体对象的主键一样,以表明它们之间的一一对应关系; 2、不需要多余的外键字段来维护关系,仅通过主键来关联,即Person的主键要依赖IdCard的主键,他们共用一个主键值。 以上两点恰与唯一外键关联相反。
主键关联的关系模型
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="Person" table="t_person"> <id name="id"> <!-- 采用foreign生成策略,forgeign会取得另外一个关联对象的标识 --> <generator class="foreign" > <param name="property">idCard</param> </generator> </id> <property name="name"></property> <!-- one-to-one指示hibernate如何加载其关联对象,默认根据主键加载 也就是拿到关系字段值,根据对端的主键来加载关联对象 constrained="true"表示约束,当前主键(person的主键)还是一个外键 参照了对端的主键(IdCard的主键),也就是会生成外键约束语句 --> <!-- idCard属性,表达的是本对象与IdCard的一对一关系。 --> <one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one> </class> </hibernate-mapping>
生成的表结构以及测试数据:
唯一外键关联:
1、两个实体对象用一个外键来关联,以表表明对象之间的关系。 2、其实它是多对一关联映射的特例,多的一端加上唯一的限制之后,用来表示一对一的关联关系。 所以它采用多对一的标签来映射,如下所示:
<!-- 采用<mang-to-one>标签来映射,指定多的一端unique为true, 这样就限制了多的一端的多重性为一,就是这样来映射的。 --> <many-to-one name="" unique="true"></many-to-one>
唯一外键的关系模型
Person.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="Person" table="t_person"> <id name="id"> <generator class="native" ></generator> </id> <property name="name"></property> <!-- 由于它是一对一的唯一外键关联,它是多对一关联的特例,注释可以直接写成多对一关联--> <!-- idCard属性,表达的是本对象与IdCard的多对一关系。 --> <many-to-one name="idCard" class="IdCard" column="idCardId" unique="true"></many-to-one> </class> </hibernate-mapping>
生成的表结构以及测试数据:
其他相同代码如下:
Person
public class Person { private int id; private String name; private IdCard idCard; public IdCard getIdCard() { return idCard; } public void setIdCard(IdCard idCard) { this.idCard = idCard; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
IdCard
public class IdCard { private int id; private String cardNo; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCardNo() { return cardNo; } public void setCardNo(String cardNo) { this.cardNo = cardNo; } }
IdCard.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.liang.hibernate"> <class name="IdCard" table="t_idCard"> <id name="id"> <generator class="native"></generator> </id> <property name="cardNo"></property> </class> </hibernate-mapping>
总结:
由于一对一主键关联映射具有以下两个缺点:
1、灵活性差,没有办法改成多对一关联映射,不能应变多变的需求;
2、必须先保存关联对象IdCard,之后才能保持Person;
所以,在映射一对一单向关联映射时,我们采用唯一外键关联映射。
0 0
- 三大框架SSH成长路程(五)
- 三大框架SSH成长路程(三)
- 三大框架SSH成长路程(一)
- 三大框架SSH成长路程(二)
- 三大框架SSH成长路程(四)
- 三大框架SSH成长路程(六)
- 三大框架SSH成长路程(七)
- 三大框架SSH成长路程(八)
- 三大框架SSH成长路程(九)
- 三大框架SSH成长路程(十)
- 三大框架SSH成长路程(十一)
- 三大框架SSH成长路程(十二)
- 三大框架SSH成长路程(十三)
- 三大框架SSH成长路程(十四)
- 三大框架SSH成长路程(十五)
- 三大框架SSH成长路程(十六)
- 三大框架SSH成长路程(十七)
- 三大框架SSH成长路程(十八)
- 附加依赖库设置错误,出现invalid or corrupt file: cannot read at 0x2B0
- android 去除空格
- python nose模块简单使用
- 测试
- 百度定位
- 三大框架SSH成长路程(五)
- 使用Zxing扫描到的二维码拉伸问题
- fenzhifa
- Part 3 - Using custom view engines with asp.net mvc
- Ajax请求中的async:false/true的作用
- AsyncTask用法
- 【ReLU】Rectified Linear Units, 线性修正单元激活函数
- Intel Code Challenge Final Round C 大模拟
- python 根据网址获取股票