【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联
2015-12-11 11:31
549 查看
接着上篇文章,唯一外键关联,就是给一对一关联关系中某个对象加一个外键。比如这里给t_person表添加一个外键,指向t_idcard的主键,并且规定t_person中的外键idCard唯一,也可以达到一对一映射的效果。
一对一单向关联映射
Po对象:
IdCard .java
Person.java
映射文件:
IdCard.hbm.xml
Person.hbm.xml
与上篇文章中主键关联不同的是,t_person的主键生成策略为 native ,不再以外键形式关联到t_idcard的主键了,而是用
建表时生成的sql语句为:
至此,唯一外键关联就已经配好了,下面进行测试。
插入测试
由于t_person生成策略为native,跟t_idcard无关,所以在第四行代码中先执行了session.save(idCard),目的是把idCard变为变为transient状态,否则在清理脏数据时会报错:“org.hibernate.TransientObjectException: object references an unsaved transient instance”
插入的数据如下:
插入时执行的sql语句:
查询测试
实际执行sql语句:
执行结果
一对一双向关联映射
双向关联和上一篇文章道理一样,也很简单,Person.java和Person.hbm.xml都不用改动,在IdCard中添加一个person属性,配置文件中与t_person的关系为one-to-one。
Po对象:
IdCard .java
映射文件:
IdCard.hbm.xml
因为这里配置的实质是一张身份证只对应一位公民,所以用
唯一外键关联较主键关联映射的好处就是,万一哪天需求变了,这两个对象的关系由一对一变为多对一,那么直接把外键唯一的约束去掉就行。
而且唯一外键关联其实就是多对一关联的一种特殊情况,下面将会介绍多对一关联的情况。
【 转载请注明出处——胡玉洋《【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联》】
一对一单向关联映射
Po对象:
IdCard .java
public class IdCard { private int id; private String cardNo; //getter、setter }
Person.java
public class Person { private int id; private String name; private IdCard idCard; //getter、setter }
映射文件:
IdCard.hbm.xml
<hibernate-mapping package="org.hibernate.test" > <class name="com.danny.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
Person.hbm.xml
<hibernate-mapping package="org.hibernate.test" > <class name="com.danny.hibernate.Person" table="t_person"> <id name="id" type="int"> <generator class="native"> </generator> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping>
与上篇文章中主键关联不同的是,t_person的主键生成策略为 native ,不再以外键形式关联到t_idcard的主键了,而是用
<many-to-one>标签重新与t_idcard建立了多对一的关系,这样就会在t_person表中生成一个外键关联到t_idcard的主键,并且
unique="true"会对此外键生成唯一约束
建表时生成的sql语句为:
drop table if exists t_idCard drop table if exists t_person create table t_idCard (id integer not null auto_increment, cardNo varchar(255), primary key (id)) create table t_person (id integer not null auto_increment, name varchar(255), idCard integer unique, primary key (id)) alter table t_person add index FK785BED80F7C7B4CE (idCard), add constraint FK785BED80F7C7B4CE foreign key (idCard) references t_idCard (id)
至此,唯一外键关联就已经配好了,下面进行测试。
插入测试
session.beginTransaction(); IdCard idCard=new IdCard(); idCard.setCardNo("123456789"); session.save(idCard); Person person=new Person(); person.setName("danny"); person.setIdCard(idCard); session.save(person); session.getTransaction().commit();
由于t_person生成策略为native,跟t_idcard无关,所以在第四行代码中先执行了session.save(idCard),目的是把idCard变为变为transient状态,否则在清理脏数据时会报错:“org.hibernate.TransientObjectException: object references an unsaved transient instance”
插入的数据如下:
插入时执行的sql语句:
insert into t_idCard (cardNo) values (?) insert into t_person (name, idCard) values (?, ?)
查询测试
Person person=(Person)session.load(Person.class, 1); System.out.println("person的name:"+person.getName()); System.out.println("person的cardNo:"+person.getIdCard().getCardNo());
实际执行sql语句:
select person0_.id as id0_0_, person0_.name as name0_0_, person0_.idCard as idCard0_0_ from t_person person0_ where person0_.id=? select idcard0_.id as id1_0_, idcard0_.cardNo as cardNo1_0_ from t_idCard idcard0_ where idcard0_.id=?
执行结果
person的name:danny person的cardNo:123456789
一对一双向关联映射
双向关联和上一篇文章道理一样,也很简单,Person.java和Person.hbm.xml都不用改动,在IdCard中添加一个person属性,配置文件中与t_person的关系为one-to-one。
Po对象:
IdCard .java
public class IdCard { private int id; private String cardNo; private Person person; //getter、setter }
映射文件:
IdCard.hbm.xml
<hibernate-mapping package="org.hibernate.test" > <class name="com.danny.hibernate.IdCard" table="t_idCard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <one-to-one name="person" property-ref="idCard"/> </class> </hibernate-mapping>
因为这里配置的实质是一张身份证只对应一位公民,所以用
<one-to-one>标签,
property-ref="idCard"指t_idcard的主键与t_person中的idCard字段对应。
唯一外键关联较主键关联映射的好处就是,万一哪天需求变了,这两个对象的关系由一对一变为多对一,那么直接把外键唯一的约束去掉就行。
而且唯一外键关联其实就是多对一关联的一种特殊情况,下面将会介绍多对一关联的情况。
【 转载请注明出处——胡玉洋《【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联》】
相关文章推荐
- Linux Generating SSH Keys
- perl脚本实现限制ssh最大登录次数(支持白名单)
- rsync ssh 数据同步分析
- Hibernate Oracle sequence的使用技巧
- jsp Hibernate批量更新和批量删除处理代码
- jsp hibernate的分页代码第1/3页
- 搭建SSH时的思考和遇到的几个问题的解决方法
- SSH 使用原理 与解释
- JAVA+Hibernate 无限级分类
- SSH整合中 hibernate托管给Spring得到SessionFactory
- jsp hibernate 数据保存操作的原理
- hibernate中的增删改查实现代码
- 解决hibernate+mysql写入数据库乱码
- java优化hibernate性能的几点建议
- java Hibernate延迟加载
- hibernate 常用方法介绍
- Linux VPS利用SSH重置ROOT密码的方法
- ssh,scp自动登陆的实现方法
- ssh非交互式密码授权远程执行脚本