hibernate中的继承关系

 

  1. 1.       hibernate中的继承关系

 

代码;

 

<1>POJO类:(Person类)

 


package qau.edu;

import java.util.Date;

public class Person {

//  成员变量;

private int id ;

private String name ;

private Date date ;

//  相应的getter和setter方法;

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;

}

public Date getDate() {

return date;

}

public void setDate(Date date) {

this.date = date;

}

}

 

 

 

Teacher类)

 


package qau.edu;

public class Teacher extends Person {

//  成员变量;

private String job ;

//  相应的getter和setter 方法;

public void setJob(String job){

this.job = job ;

}

public String getJob(){

return job ;

}

}

 

 

 

<2>、关系映射文件;

 

Person

 


<?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">

<class name="Person" table="t_person" discriminator-value="Person">

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

<generator class="native"/>

</id>

<!-- 配置辨别项 -->

<discriminator column="TYPE"/>

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

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

<!-- 配置继承关系 -->

<subclass name="Teacher" discriminator-value="Teacher">

<property name="job" column="T_job"/>

</subclass>

</class>

</hibernate-mapping>

 

 

 

<3>、测试类;(进行相关的保存和查询的操作)

 

 


package qau.edu;

 

import java.util.Date;

 

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

 

public class RenTest {

 

        

         private Session session ;

         private Transaction tr ;

        

        

         @Before

         public void init(){

                  

//               打开Session ;

                  

                   session = new Configuration().configure().buildSessionFactory().openSession();

                  

//               开启事务;

                  

                   tr = session.beginTransaction();

                  

                  

         }

        

        

         @After

         public void destroy(){

                  

//               提交事务;

                  

                   tr.commit();

                  

//               关闭会话;

                  

                   session.close();

         }

        

        

        

//     进行保存操作;

        

         @Test

         public void testSave() {

                  

//               实例化对象;

                  

                   Person per = new Person();

                  

//               设置属性值;

                  

                   per.setName("AAA");

                   per.setDate(new Date());

                  

                  

//               实例化Teacher对象;

                  

                   Teacher teacher = new Teacher();

                  

//               设置属性值;

                  

                   teacher.setName("BB");

                   teacher.setDate(new Date());

                   teacher.setJob("Teacher");

                  

//               保存对象;

                  

                   session.save(per);

                   session.save(teacher);

                  

 

                  

         }

        

        

//     进行查询操作;

        

         @Test

         public void testGet(){

                  

//               获取对象;

                  

                   Person  per = (Person)session.get(Person.class, 1);

                  

//               输出;

                  

                   System.out.println("名字是:" + per.getName());

                  

//               获取teacher对象;

                  

                   Teacher ter = (Teacher)session.get(Teacher.class, 2);

                  

//               输出:

                  

                   System.out.println("工作是:" + ter.getJob());

         }

 

}

 

 

 

执行结果:

 

 


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 t3_0_0_,

person0_.t_date as t4_0_0_,

person0_.T_job as T5_0_0_,

person0_.TYPE as TYPE0_0_

from

t_person person0_

where

person0_.t_id=?

名字是:AAA

Hibernate:

select

teacher0_.t_id as t1_0_0_,

teacher0_.t_name as t3_0_0_,

teacher0_.t_date as t4_0_0_,

teacher0_.T_job as T5_0_0_

from

t_person teacher0_

where

teacher0_.t_id=?

and teacher0_.TYPE=‘Teacher‘

工作是:Teacher

Hibernate:

insert

into

t_person

(t_name, t_date, TYPE)

values

(?, ?, ‘Person‘)

Hibernate:

insert

into

t_person

(t_name, t_date, T_job, TYPE)

values

(?, ?, ?, ‘Teacher‘)

 

 

另一种方法:

 

 

代码:

 

映射文件:

 


 

<?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">

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

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

<generator class="native"/>

</id>

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

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

<!-- 配置继承关系 -->

<joined-subclass name="Teacher">

<key column="T_Id"/>

<property name="job"/>

</joined-subclass>

</class>

</hibernate-mapping>

 

 

其他的代码相同:

 

执行结果:

 


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)

values

(?, ?)

Hibernate:

insert

into

t_person

(t_name, t_date)

values

(?, ?)

Hibernate:

insert

into

Teacher

(job, T_Id)

values

(?, ?)

 

 

 

通过上面知道:

 

 

第一种方式也就是<subclass>时候进行插入的时候是在一张表中进行的,但是在第二种的时候却是:

进行插入父类数据的时候是只在父表中进行的,但是当进行子类数据的插入时候却是先进行的父表的插入,然乎再进行的子类表的插入,因为第一种方式只是生成了一张表,第二种则是生成了两个表。

 

 

 

时间: 2024-08-24 19:19:00

hibernate中的继承关系的相关文章

在Entity Framework 中实现继承关系映射到数据库表

继承关系映射到数据库表中有多种方式: 第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表) 仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分列(Disciriminator column)(通常内容为子类的类型名)来区分哪一行表示什么类型的数据. 第二种:TPT(Table-per-type) 每种类型都有一张表(父类及每个子类都有表) 父类.各子类各自都有一张表.父类的表中只有共同的数据,子类表中有子类特定的属性.TPT很像类的继承结

Hibernate中的映射关系(一对多)

在数据库中表和表之间的关系有几种,下面就详细说一下在Hibernate中怎样映射一对多的关系 Hibernate映射一对多的关系,其实就是持久类之间的映射,那如何把持久类关联起来呢??那就用到.hbm.xml文件的<many-to-one>标签了 具体做法如下: 新建一个customer类: package com.jeremy.hibernate.app.example; public class Customer { private Integer customerId; private

关于hibernate中多对多关系

关于多对多关系 数据库:在使用多对多的关系时,我们可以使用复合主键.也可以不使用,直接引入外键同样可以实现. 在数据库中使用多对多关系时,需要一个中间表. 多对多关系中的数据库结构如下: 表:Orders 字段:orderid(主键)..... 表:Users 字段:usersid(主键),.... 中间表: cy_order_user 字段:cy_order_user主键id 外键:cy_orderid(引入Orders表) 外键:cy_usersid(引入Users表) 注意:中间表的外键是

初步学习C++中的继承关系

 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. #include<<span style="font-size:14px;">iostream</span>> using namespace std; class Base { public: Base() {} ~Base() {} p

hibernate中一对多关系模式的设计

hibernate中一对多的关系模式的设计 注解应该交由多的一方维护和管理. 例如:bbs的模块设计 三个表 版块表(category) .主题帖表(topic)和回帖表(msg) 他们之间的对应关系是:一个版块对应多个主题帖,一个主题帖有多个回复贴. 以下是对应的建表语句. CREATE TABLE `category` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, PRIMARY KEY (

Java中的继承关系的加载顺序

/* 在加载类时,Java虚拟机先加载父类再加载子类,再对静态初始化块. 静态成员变量(类变量).静态方法进行一次初始化. 只有调用new方法时才会创建类的对象.按照父子继承关系进行初始化, 首先执行父类的初始化块部分,然后是父类的构造方法,再执行子类的 初始化块,最后是子类的构造方法. 销毁对象的过程是:首先销毁子类部分,再销毁父类部分. */ public class InheritanceLoadOrder { public static void main(String[] args)

java中的继承关系

1.定义 java中的继承是单一的,一个子类只能拥有一个父类:java中所有类的父类是java.lang.Object,除了这个类之外,每个类只能有一个父类: 而一个父类可以有多个子类,可以被多个子类继承: Java只支持单继承,也就是说,一个类不能继承多个类. Java只支持单继承(继承基本类和抽象类),但是我们可以用接口来实现(多继承{实现}接口来实现),脚本结构如: public class One extends Parent implements Two,Three,Four{} 2.

Hibernate中的继承映射

1.继承映射 继承映射分为两种情况:简单继承映射和继承映射. 在简单继承映射中,每个子类都要写一个映射文件. 在继承映射中,只使用一个映射文件.继承映射分为三种情况: 所有子类映射到一张表 需要使用鉴别器字段,不符合数据库设计原则 每个类映射到一张表 父类映射到一张表,插入一条子类信息,需要两条sql,父子表之间有外键约束 每个类映射到一张表,父类不映射表 必须使用uuid作为主键类型,所以bean中主键对应的属性不能是int类型 2.简单继承映射 <?xml version="1.0&q

Hibernate中多对多关系转换

问题来源 在运用SSH架构开发Web应用时,总会遇到表之间一对多.多对一.多对多等等的关系,而对于多对多的关系,在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型:hibernate会为我们创建中间关联表,转换成两个一对多. 问题解决 在此用开发OA项目时角色表和权限之间的多对多关系提供解决问题的建议 例子:角色与权限 (1)先看需求 (2)分析 第一,角色与权限:多对多 一个角色可以有多个权限,一个权限可以被多个角色使用 第二,在角色的增删改查中涉及到了