Hibernate学习笔记3

 

Hibernate学习笔记3

学习课程:

13_多对一关联映射.avi

Hibernate_03_manyToone

14_一对一主键关联映射_单向.avi

Hibernate_04_oneToone_pk_1

14_一对一主键关联映射_双向.avi

Hibernate_05_oneToone_pk_2

16_一对一唯一外键关联映射_单向.avi

Hibernate_06_oneToone_upk_1 

16_一对一唯一外键关联映射_向.avi

Hibernate_07_oneToone_upk_2 

学习内容:

多对一关联映射

一对一主键关联映射_单向

一对一主键关联映射_双向

一对一唯一外键关联映射_单向

一对一唯一外键关联映射_双向

一对一主键关联映射_单向

一对一主键关联映射_双向

一对一唯一外键关联映射_单向

一对一唯一外键关联映射_双向

1.多对一关联映射

多对一关联映射

关联映射的本质:

* 将关联关系映射到数据库(关联关系:对象模型在内存中的一个或多个引用)

在多的一段的映射文件加入

<many-to-one name="group" cloumn="groupid"/><!--group为SQLServer的关键字所以要指定外键-->

在"多"的一端加入字段作为外键参照"一"端

重要属性(cascade)级联

*级联的意思是指定两个而对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的

级联对象也需要执行想同的操作

*总工可以取值为: all、none、save-update、delete

*all——代表在所有的情况下都执行级联操作

*none——在所有的情况下都不执行级联操作

*save-update——在保存和更新的时候执行级联操作

*delete——在删除的时候执行级联操作

*如:<many-to-one name="group" column="groupid"

  cascade="all"/>

persistent状态的对象不能引用 transisent状态的对象

testLoad1 查询保存在user_message中的数据信息,以及相关外键的信息

1.修改原先定义好的User类中id属性类型为int

2.在User.hbm.xml文件中添加字段<many-to-one name="group" column="groupid" ></many-to-one>,修改生成策略为native

3.新建Group.java实体类添加字段 id name 以及get和set方法 id类型int name类型String,并且生成相应的配置文件,其中生成策略为native

4.执行testExport.java

测试类中方法的主要代码片段:

所有测试方法,以及其作用

testManyToOne1 不保存Group对象,会报错

testManyToOne2 保存Group对象,不会报错

testManyToOne3 不保存Group对象,但是设置cascade属性为all,不会报错

testLoad1 查询保存在user_message中的数据信息,以及相关外键的信息

testManyToOne1

  1. Group group = new Group();
  2. group.setName( "科学家" );
  3. User user = new User();
  4. user.setName( "爱因斯坦" );
  5. user.setAge( 20 );
  6. user.setCreateTime( new Date() );
  7. user.setExpireTime( new Date() );
  8. user.setGroup( group ); 
  9. session.save( user );

 

testManyToone2

  1. Group group = new Group();
  2. group.setName( "科学家" );
  3. session.save( group );
  4. User user = new User();
  5. user.setName( "爱因斯坦" );
  6. user.setAge( 20 );
  7. user.setCreateTime( new Date() );
  8. user.setExpireTime( new Date() );
  9. user.setGroup( group );
  10. session.save( user );

testManyToone3

  1. Group group = new Group();
  2. group.setName( "科学家" );
  3. User user = new User();
  4. user.setName( "爱因斯坦" );
  5. user.setAge( 20 );
  6. user.setCreateTime( new Date() );
  7. user.setExpireTime( new Date() );
  8. user.setGroup( group );
  9. session.save( user );

 

testLoad()

测试结果:

Hibernate: 向 user_message中发送查询语句

爱因斯坦

Hibernate: 向 group_message表发送查询语句

科学家

  1. User user = ( User )session.get( User.class ,  1 );
  2. System.out.println( user.getName() );
  3. System.out.println( user.getGroup().getName() );

 2.一对一主键关联映射_单向

一对一关联映射(one-to-one)

*两个对象之间是一对一的关系,如Person—IdCard

*有两种策略可以实现一对一的关联映射

*主键关联:即让两个对象具有相同的主键值, 以表明他们之间的一一对应的关系,  这样可以避免多余的字段被创建; 数据库不会有额外的字段来维护它们之间的关

 系,仅通过表的主键来关联

*唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之

 后,也可以用来表示一对一关联关系。

单向关联 :只能一端访问另一段。

双向关联 :两端可以进行互相访问。

hibernate_04_oneToone_pk_1

例子

Person :(int id ),(String name),(IdCard idCard)

IdCard :(int id ),( String cardNo)

Person中的id字段作为一个外键参照IdCard中的id字段,

即Persion中的id字段的数据来源于IdCard中的id字段值,共享IdCard的主键

设置Person.hbm.xml生成策略为foreign,加参数<param name="property">idCard</param>

只是Hibernate怎么加载它的关联对象,默认根据主键加载

<one-to-one name="idCard" constrained="true"(外键约束,表名当前主键上存在一个约束,Person

的主键作为外键参照IdCard) ></one-to-one>

一对一关联映射中默认了cascade属性

所以不用保存IdCard就能够运行成功。

session.save(person);执行过该语句后Hibernate发送insert into idCard_message 

当提交事务以后Hibernate再发送insert into person_message

session.get( 类名,id值);

通过人来查找身份证号。

测试类,方法的主要代码:

testSave()

  1. Group group = new Group();
  2. group.setName( "科学家" );
  3. User user = new User();
  4. user.setName( "爱因斯坦" );
  5. user.setAge( 20 );
  6. user.setCreateTime( new Date() );
  7. user.setExpireTime( new Date() );
  8. user.setGroup( group );

testLoad()

 

  1. Person person = (Person) session.get( Person.class , 3 );
  2. System.out.println( "person.name = " + person.getName() );
  3. System.out.println( "person.idCard = " +
  4. person.getIdCard().getCardNo());

 

 2.一对一主键关联映射_双向

Person <----> IdCard 

在IdCard端持有person的引用

在IdCard.hbm.xml中加入<one-to-one name="person"/>指向person 指示Hibernate如何加载person

默认根据加载主键

进行加载的时候,使用IdCard查询Person.name

只发送一条查询语句,fatch默认join,只发送一条外连接

相关主要代码:

testSave()

添加数据

  1. IdCard idCard = new IdCard();
  2. idCard.setCardNo( "1111111" );
  3. Person person = new Person();
  4. person.setName( "太阳星" );
  5. person.setIdCard( idCard );

testLoad1()

IdCard

-->

Person

进行查询数据

 

  1. IdCard idCard = (IdCard) session.get( IdCard.class1 );
  2. System.out.println( "person.name = " +
  3.  idCard.getPerson().getName() );
  4. System.out.println( "person.cardNo" +
  5.  idCard.getCardNo() );

testLoad2()

Person

-->

IdCard

进行查询数据

 

  1. Person person = (Person) session.get( Person.class , 1 );
  2. System.out.println( "Person.name = " +
  3.  person.getName() );
  4. System.out.println( "Person.cardNo = " +
  5.  person.getIdCard().getCardNo() );

 

 3.一对一唯一外键关联映射——单向

多对一映射的特例

hibernate04_oneToone_upk_1

person_message与idCard_message 增加字段IdCard,person主键自增

<many-to-one name="idCard" unique="true" />显示多的一端的多重性唯一

相关主要代码:

testeSave()

添加数据

 

  1. IdCard idCard = new IdCard();
  2. idCard.setCardNo( "1111111" );
  3. session.save( idCard );
  4. Person person = new Person();
  5. person.setName( "太阳星" );
  6. person.setIdCard( idCard );

 

testLoad()

Person

-->

IdCard

  1. Person person = (Person) session.get( Person.class , 1 ); 
  2. System.out.println( "person.name = " +
  3.  person.getName() );
  4. System.out.println( "person.idCard = " +
  5.  person.getIdCard().getCardNo());

 

 4.一对一唯一外键关联映射——双向

在idcard中加入字段person

采用one-to-one来进行映射 ,指示hibernate如何加载其关联对象,默认根据主键加载person,因为外键

关联映射中采用,因为两个实体采用的是person的外键进行维护的关系,所以不能指定主键加载person,

而要根据person的外键进行加载,所以设置property-ref属性来指定向哪个字段进行比较

<one-to-one name="person" property-ref="idCard" />

相关主要代码:

testSave()

添加数据

 

  1. IdCard idCard = new IdCard();
  2. idCard.setCardNo( "1111112" );
  3. session.save( idCard );
  4. Person person = new Person();
  5. person.setName( "太阳星" );
  6. person.setIdCard( idCard );

 

testLoad1()

IdCard

-->

Person

进行查询数据

  1. IdCard idCard = (IdCard) session.get( IdCard.class , 1 );
  2. System.out.println( "person.name = " +
  3.  idCard.getPerson().getName() );
  4. System.out.println( "person.idCard = " +
  5.  idCard.getCardNo() );

 

testLoad2()

Person

-->

IdCard

进行查询数据

  1. Person person = (Person) session.get( Person.class ,  1 ); 
  2. System.out.println( person.getName() + "   "
  3.  + person.getIdCard().getCardNo() );

 

提示:

修改one-to-one中的属性不用重新生成表

修改many-to-one中的属性需要重新生成表

你可能感兴趣的:(数据库,Hibernate,测试,user,delete,sqlserver)