继承关系中的第三种方式:利用<union-subclass>(补充)

继承关系中的第三种方式:利用<union-subclass>

 

代码:

 

映射文件(其他的代码和其他继承关系相同)

 

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="qau.edu.union">

 

    <class name="Person" table="t_person">

   

       <id name="id" column="t_id">

          <generator class="hilo"/>

       </id>

      

     

       <property name="name" column="t_name"/>

       <property name="date" column="t_date"/>

      

       <!-- 配置继承关系 (利用union-subclass进行)-->

      

       <union-subclass name="Teacher" table="TEACHER">

          

           <property name="job"/>

          

       </union-subclass>

      

      

    </class>

   

</hibernate-mapping>

 

 

执行结果:

 

进行Save操作的结果:

 

 


log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Hibernate:

    insert

    into

        t_person

        (t_name, t_date, t_id)

    values

        (?, ?, ?)

Hibernate:

    insert

    into

        TEACHER

        (t_name, t_date, job, t_id)

    values

        (?, ?, ?, ?)

 

 

 

 

只有两条记录,说明还是比较方便的。

 

获取对象的操作的执行结果:

 


log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).

log4j:WARN Please initialize the log4j system properly.

log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

Hibernate:

    select

        person0_.t_id as t1_0_0_,

        person0_.t_name as t2_0_0_,

        person0_.t_date as t3_0_0_,

        person0_.job as job1_0_,

        person0_.clazz_ as clazz_0_

    from

        ( select

            t_id,

            t_name,

            t_date,

            null as job,

            0 as clazz_

        from

            t_person

        union

        select

            t_id,

            t_name,

            t_date,

            job,

            1 as clazz_

        from

            TEACHER

    ) person0_

where

    person0_.t_id=?

名字是:AAA

Hibernate:

    select

        teacher0_.t_id as t1_0_0_,

        teacher0_.t_name as t2_0_0_,

        teacher0_.t_date as t3_0_0_,

        teacher0_.job as job1_0_

    from

        TEACHER teacher0_

    where

        teacher0_.t_id=?

工作是:Teacher

 

 

 

通过这样的执行结果可以看出:在执行子类的查询的时候只是访问的是子类的表,但是进行父类的查询的时候却是进行的两张表的查询。这是比较麻烦的事情。

但是这是这种方式<union-subclass>的一种优势。

时间: 2024-10-05 11:41:26

继承关系中的第三种方式:利用<union-subclass>(补充)的相关文章

javascript中构造函数的三种方式

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 创建函数的三种方式: // 1 函数声明 // 2 函数表达式 //

JS中创建对象的三种方式

<script> 2 //创建对象的三种方式 3 // 1.利用对象字面量(传说中的大括号)创建对象 4 5 var obj1 = { 6 uname: 'ash', 7 age: 18, 8 sex: "女", 9 sayhi: function() { 10 console.log("hello kitty"); 11 12 } 13 } 14 15 //访问属性的两种方法 16 console.log(obj1.uname); 17 console

SQL Server中Upsert的三种方式

本文介绍了SQL Server中Upsert的三种常见写法以及他们的性能比较. SQL Server并不支持原生的Upsert语句,通常使用组合语句实现upsert功能. 假设有表table_A,各字段如下所示: int型Id为主键. 方法1:先查询,根据查询结果判断使用insert或者update IF EXISTS (SELECT 1 FROM table_A WHERE Id = @Id) BEGIN UPDATE dbo.table_A SET Value = @Value WHERE

C#中 sqlDataRead 的三种方式遍历读取各个字段数值

------------------------------------------------------------------------------------------------- 数据库的查询分析器中写上如下代码: ccreate table studentname( id  int   primary key  identity(1,1) not null ,name nvarchar(500) not null) insert into studentname values(

Struts2学习(二)运行Action中方法的三种方式

1.运行execute()方法 一般的能够直接在action中书写execute,调用action时会自己主动运行此方法 2.配置method方法 在struts.xml中配置action时.写method属性设置方法.例如以下所看到的.这样写能够在一个action类中写多个运行的方法.简化结构. <package name="user" extends="struts-default" namespace="/user"> <

c# number求和的三种方式

直接看源代码: 总结: 第一种方式,利用中间变量进行累加,这种方式最简单粗暴: 第二种方式; 利用我们linq aggretion(聚合)的原理,有点函数编程的感觉,每一次求和的结果,参与到下一次的计算中: 第三种方式:经典的递归: 三种方式,结果没有什么,差异,更过的是体会实现过程: /// <summary> /// 这种是利用中间变量实现累加的一个过程: /// </summary> static void Sum() { int sum = 0; int n = 3; fo

spring boot读取配置的三种方式

首先我们在application.yml就简单定义一个端口号的配置吧. 1:Environment:通过Environment的getProperty方法来获取想要的配置信息  如下图: 2:@Value 可以注入具体的配置信息 如下图: 3:自定义配置类:prefix定义配置的前缀 如下图: 然后注入到 其他的类中 以上的三种方式获配置文件的信息 原文地址:https://www.cnblogs.com/thisisme/p/12116965.html

Java中 实现多线程成的三种方式(继承,实现,匿名内部类)

------------------------------------------------------------------------------------------------------------ /** 第一种方式:继承Thread类 *             1. 定义一个类,然后让该类继承Thread类 *             2. 重写run方法 *             3. 创建定义的这个类的对象 *             4. 启动线程 */ //继承

iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)

#import "ViewController.h" #import "SecondViewController.h" @interface ViewController () @property (retain, nonatomic) IBOutlet UITextField *textField; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // D