Hibernate学习笔记6

 

Hibernate学习笔记6

学习课程:

继承映射——单表映射(table per class hiberarchy)

Hibernate_12_Extends_1

继承映射——具体表映射(table per subclass)

Hibernate_13_Extends_2

继承映射——类表继承(table per concrete class)

Hibernate_14_Extends_3

学习内容:

继承映射

对象模型图:

Hibernate学习笔记6_第1张图片

  1.每棵继承树映射成一张表

t_animal

id

name

sex

weight

height

type

1

猪猪

true

100

P

2

鸟鸟

false

50

B

映射文件Animal.hbm.xml配置:

 

  1. <class name="Animal" table="t_animal" lazy="true">
  2. <id name="id" >
  3. <generator class="native" />
  4. id>
  5. <discriminator column="type" type="string"/>
  6. <property name="name" />
  7. <property name="sex" />
  8. <subclass name="Pig" discriminator-value="P">
  9. <property name="weight" />
  10. subclass>
  11. <subclass name="Bird" discriminator-value="B">
  12. <property name="height" />
  13. subclass>
  14. class>

 

  2.每个子类映射成一张表

t_animal

id

name

sex

1

猪猪

true

2

鸟鸟

false

t_pig

pid

weight

1

100

t_bird

bid

height

2

50

映射文件Animal.hbm.xml配置:

 

  1. <joined-subclass name="Pig" table="t_pig">
  2. <key column="pig_id" />
  3. <property name="weight" />
  4. joined-subclass>
  5. <joined-subclass name="Bird" table="t_bird">
  6. <key column="bird_id" />
  7. <property name="height" />
  8. joined-subclass>

 

  3.每个具体类映射成一张表

t_pig

id

name

sex

weight

1

猪猪

true

100

t_bird

id

name

sex

height

2

鸟鸟

false

50

映射文件Animal.hbm.xml配置:

  1. <class name="Animal" table="t_animal" lazy="true">
  2. <id name="id" >
  3. <generator class="uuid" />
  4. id>
  5. <property name="name" />
  6. <property name="sex" />
  7. <union-subclass name="Pig" table="t_pig">
  8. <property name="weight" />
  9. union-subclass>
  10. <union-subclass name="Bird" table="t_bird">
  11. <property name="height" />
  12. union-subclass>
  13. class>
d

进行测试的方法

testSave1()

插入两条记录

测试结果:插入成功

1 P 八戒 1 888

NULL

2 B 凤凰 0 NULL 999

  1. Pig pig = new Pig();
  2. pig.setName("八戒");
  3. pig.setSex(true);
  4. pig.setWeight(888);
  5. session.save(pig);
  6. Bird bird = new Bird();
  7. bird.setName("凤凰");
  8. bird.setSex(false);
  9. bird.setHeight(999);
  10. session.save(bird);

testSave2()

插入两条记录

测试结果:插入成功

1 P 八戒 1 888

NULL

2 B 凤凰 0 NULL 999

注:此测试方法用于第三种映射方式:每个具体类映射成一张表

中插入数据的两种情况

 1.将id的生成策略给为assigned,

 2.修改id的类型为Strng,生成策略为uuid

 

  1. Pig pig = new Pig();
  2. //pig.setId( 1 );
  3. pig.setName("八戒");
  4. pig.setSex(true);
  5. pig.setWeight(888);
  6. session.save(pig);
  7. Bird bird = new Bird();
  8. //bird.setId( 2 );
  9. bird.setName("凤凰");
  10. bird.setSex(false);
  11. bird.setHeight(999);
  12. session.save(bird);

 

testLoad1()

加载方式load

方向:通过Pig加载,查询Pig的name字段值

测试结果:

pig's name :八戒

pig's weight :888

 

  1. Pig pig = (Pig) session.load(Pig.class1);
  2. System.out.println("pig's name :" + pig.getName());
  3. System.out.println("pig's weight :" + pig.getWeight());

 

testLoad2()

加载方式load

方向:通过Animal加载,查询Animal的name字段值

测试结果:

animal's name :八戒

 

  1. Animal animal = (Animal)
  2. session.load(Animal.class1);
  3. System.out.println("animal's name :" + animal.getName());

 

testLoad3()

加载方式load 方向:通过Animal加载,判断 (animal instanceof Pig )Animal中是不是Pig

测试结果:

no ,this is not a pig 

  1. Animal animal = (Animal) session.load(Animal.class1);
  2. if (animal instanceof Pig) {
  3. System.out.println("yes , this is a pig !");
  4. else {
  5. System.out.println("no ,this is not a pig ");
  6. }

 

testLoad4()

通过Get进行查询,Animal返回具体的Pig类型,(animal instanceof Pig)为true

测试结果:

yes , this is a pig !

  1. Animal animal = (Animal) session.get(Animal.class1);
  2. if (animal instanceof Pig) {
  3. System.out.println("yes , this is a pig !");
  4. else {
  5. System.out.println("no ,this is not a pig ");
  6. }

testLoad5()

查询方式为load ,设置 ,支持多台查询,

查询Animal返回具体的Pig类型,(animal instanceof Pig)为true

测试结果:

no ,this is not a pig 

  1. Animal animal = (Animal) session.load(Animal.class1);
  2. if (animal instanceof Pig) {
  3. System.out.println("yes , this is a pig !");
  4. else {
  5. System.out.println("no ,this is not a pig ");
  6. }

testLoad6()

现将lazy设置为true 通过HQL进行查询

List animalList = session.createQuery( "from Animal" ).list();

HQL支持多态查询,能够正确的鉴别出真正的类型

测试结果:

这是一头猪。

这是一只鸟。

  1. List animalList =
  2.  session.createQuery( "from Animal" ).list();
  3. for ( Animal a : animalList ){
  4. if ( a instanceof Pig){
  5. System.out.println( "这是一头猪。" );
  6. else if ( a instanceof Bird ){
  7. System.out.println( "这是一只鸟。" );
  8. else {
  9. System.out.println( "这是一个新品种????????" );
  10. }
  11. }

testLoad7()

通过HQL进行查询

查询类型为Object

测试结果:

这是一头猪。

这是一只鸟。

  1. List animalList =
  2.  session.createQuery( "from java.lang.Object" ).list();
  3. for ( Animal a : animalList ){
  4. if ( a instanceof Pig){
  5. System.out.println( "这是一头猪。" );
  6. else if ( a instanceof Bird ){
  7. System.out.println( "这是一只鸟。" );
  8. else {
  9. System.out.println( "这是一个新品种????????" );
  10. }
  11. }

补充信息

1、理解如何映射

因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有

某种机制来区分哪些记录是属于哪个类的。这种机制就是,在表中添加一个字段,用这

个字段的值来进行区分。用hibernate实现这种策略的时候,有如下步骤:

父类用普通的标签定义

在父类中定义一个discriminator,即指定这个区分的字段的名称和类型

如:

子类使用标签定义,在定义subclass的时候,需要注意如下几点:

Subclass标签的name属性是子类的全路径名

在Subclass标签中,用discriminator-value属性来标明本子类的discriminator字段(用来区分不同类的字段)

的值Subclass标签,既可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),也可以与class标

签平行。 当subclass标签的定义与class标签平行的时候,需要在subclass标签中,添加extends属性,里面的值

是父类的全路径名称。子类的其它属性,像普通类一样,定义在subclass标签的内部。

2、理解如何存储

存储的时候hibernate会自动将鉴别字段值插入到数据库中,在加载数据的时候,hibernate能根据这个鉴别值

正确的加载对象

你可能感兴趣的:(Hibernate)