博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
继承结构中每个子类单独一张表
阅读量:4291 次
发布时间:2019-05-27

本文共 2354 字,大约阅读时间需要 7 分钟。

在上一节《》中,我们讲了在继承结构中,我们把子类和父类放在同一张表中的写法,那种写法在实际开发中,也很多的不便,所以这节我们使用每个子类单独一张表的写法。

类的继承关系和上一节一样,如图:

新建一个java项目,项目结构如图:

jar和官网获取方法,请参见《

Person、Teacher、Student以及HibernateUtil和hibernate.cfg.xml代码,都参考上一节

不同的地方是Person.hbm.xml代码:

当然同样是先生成数据库表,代码:

/**	 * 根据*.hbm.xml文件对应的生成数据库表	 */	@Test	public void testCreateDB() {		Configuration cfg = new Configuration().configure();		SchemaExport se = new SchemaExport(cfg);		// 第一个参数:是否生成ddl脚本		// 第二个参数:是否执行到数据库中		se.create(true, true);	}
运行后看到console的sql语句

drop table if exists Student    drop table if exists Teacher    create table Student (        id integer not null,        name varchar(255),        age integer,        work varchar(255),        primary key (id)    )    create table Teacher (        id integer not null,        name varchar(255),        age integer,        salary integer,        primary key (id)    )
数据库中生成的表如图:

只生成了两张表,没有生成person表,这是因为我们在Person.hbm.xml中指定了 abstract="true",

测试代码:

@Test	public void testSave() throws HibernateException, SerialException,			SQLException, IOException {		Session session = null;		Transaction tx = null;		try {			session = HibernateUtil.getSession();			tx = session.beginTransaction();			Teacher t1 = new Teacher() ;			t1.setId(1) ;			t1.setAge(32) ;			t1.setName("张老师") ;			t1.setSalary(5000) ;						Student stu1 = new Student() ;			stu1.setId(2) ;			stu1.setAge(22) ;			stu1.setName("王同学") ;			stu1.setWork("家庭作业1") ;						Student stu2 = new Student() ;			stu2.setId(3) ;			stu2.setAge(24) ;			stu2.setName("刘同学") ;			stu2.setWork("housework") ;						session.save(t1) ;			session.save(stu1) ;			session.save(stu2) ;						tx.commit();		} catch (HibernateException e) {			if (tx != null) {				tx.rollback();			}			e.printStackTrace();			throw e;		} finally {			HibernateUtil.closeSession();		}	}
运行保存代码,看到sql语句如:

Hibernate:     insert     into        Teacher        (name, age, salary, id)     values        (?, ?, ?, ?)Hibernate:     insert     into        Student        (name, age, work, id)     values        (?, ?, ?, ?)Hibernate:     insert     into        Student        (name, age, work, id)     values        (?, ?, ?, ?)
看到数据库表中的数据如图:

总结:

1、在每个具体类一张表的继承映射中,主键的生成不能使用identity,建议使用uuid,sequence,assigned等。

2、数据表的结构更加合理。多态查询效率不高。

你可能感兴趣的文章
程序员面试以及工作中真实问题汇编!
查看>>
浅谈java中的数学运算
查看>>
用大白话聊聊JavaSE
查看>>
Android 手把手带你玩转自定义相机
查看>>
仿墨迹天气的折线图控件,效果杠杠滴
查看>>
移动端防止被抓包
查看>>
Android异步批量压缩图片
查看>>
仿主流APP功能实现
查看>>
Java读取文件夹大小的6种方法及代码
查看>>
Java多线程中的10个面试要点
查看>>
Java面试经典,小题目大学问
查看>>
《程序员》:携程移动端 UI 界面性能优化实践
查看>>
Android指纹识别深入浅出分析到实战
查看>>
你们要的多数据库功能终于来了
查看>>
Android中实现微信本地视频发布到朋友圈功能
查看>>
非替代品,MongoDB与MySQL对比分析
查看>>
Hadoop平台相关技术
查看>>
java学习11天-自定义异常&异常转换(实例应用)
查看>>
MySql、SqlServer、Oracle数据库行转列大全
查看>>
程序员常用的自助建站资源汇总!
查看>>