hibernate继承映射策略之每个具体类一张表
来源:互联网 发布:mac icon 尺寸 编辑:程序博客网 时间:2024/04/23 16:26
对于“每个具体类一张表”的映射策略,可以采用两种方式。第一种方式是使用<union-subclass>。另一种方法时采用隐式多态。
以上一篇博客《hibernate单表继承映射》所述案列为例,我们主要学习第一种方式。
与上篇文章不同的Person.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo"> <!-- abstract="true":指明Person类是抽象的,不生成对应的person数据库表 --><class name="Person" abstract="true"><id name="id"> <!-- assigned:自己指定主键 --><generator class="assigned"></generator></id><property name="name" /><property name="age" /><union-subclass name="Student"><property name="work" /></union-subclass><union-subclass name="Teacher"><property name="salary" /></union-subclass></class></hibernate-mapping>测试类:
public class HibernateTest {@Testpublic void testCreateDB(){Configuration cfg=new Configuration().configure();SchemaExport se=new SchemaExport(cfg);//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中se.create(true, true);}/** * 保存数据 */@Testpublic void save(){Session session=null;Transaction tx=null;try{session=HibernateUtil.getSession();tx=session.beginTransaction();Teacher teacher=new Teacher();teacher.setId(1);teacher.setName("teacher");teacher.setAge(20);teacher.setSalary(5000);Student student=new Student();student.setId(2);student.setName("stu1");student.setAge(20);student.setWork("hello world");Student stu=new Student();stu.setId(3);stu.setName("stu2");stu.setAge(21);stu.setWork("Struts2");session.save(student);session.save(stu);session.save(teacher);tx.commit();}catch(Exception e){if(tx!=null)tx.rollback();e.printStackTrace();}finally{HibernateUtil.closeSession();}}@Testpublic void testGet(){Session session=null;Transaction tx=null;try{session=HibernateUtil.getSession();tx=session.beginTransaction();//取数据Person person=(Person) session.get(Person.class, 2);System.out.println(person.getName());if(person instanceof Student){Student stu=(Student) person;System.out.println(stu.getWork());}tx.commit();}catch(Exception e){tx.rollback();e.printStackTrace();}finally{HibernateUtil.closeSession();}}}首先执行testCreateDB,打印信息如下:
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) )数据库表信息如图:
执行save代码,打印sql语句如下:
Hibernate: insert into Student (name, age, work, id) values (?, ?, ?, ?)Hibernate: insert into Student (name, age, work, id) values (?, ?, ?, ?)Hibernate: insert into Teacher (name, age, salary, id) values (?, ?, ?, ?)数据库表信息如下:
总结:
1、在每个具体类一张表的继承映射中,主键的生成不能使用identity。建议使用uuid,sequence,assigned等。
2、数据库表的结构更加合理。多态查询效率不高。
阅读全文
0 0
- hibernate继承映射策略之每个具体类一张表
- Hibernate继承映射之每个具体类一张表
- hibernate继承映射策略之每个子类一张表
- Hibernate 继承映射实现方式之每个具体类对应一张表
- Hibernate 继承映射实现方式之每个具体类对应一张表
- Hibernate映射类继承之每个带有联合的具体类一张表(每个子类各一张表,共用一个父类映射文件)
- Hibernate映射类继承之每个带有隐式多态的具体类一张表(每个子类各一张表,有各自的映射文件)
- 【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表
- Hibernate继承映射之每个类一张表
- hibernate继承关系映射方法(三)--每个具体类一张表TPC
- 继承------类表映射-------每个具体类一张表
- Hibernate学习笔记:继承映射之每个子类一张表
- Hibernate继承映射方式之每个子类一张表
- Hibernate学习笔记:继承映射之每个类继承结构一张表
- Hibernate映射类继承之每个类层次结构一张表(父子类共用一张表,一个映射文件)
- 十四、Hibernate实体映射(每个具体类映射成一张表)
- Hibernate映射类继承之每个类一张表(父子类都有各自的表,并共用一个映射文件)
- Hibernate系列之继承关系:每个类一张表
- 2017.08.12【NOIP提高组】模拟赛B组 巴比伦
- JQuery动画2
- LinqToSql 动态查询条件,join, isnull 综合示例
- 18考研-数据结构复习笔记-线性表02
- c++中的算法--变动性算法---复制
- hibernate继承映射策略之每个具体类一张表
- Mac下使用 IntelliJ IDEA
- js调试之console.log()
- flex
- python 数据可视化 matplotlib学习一:绘制简单的折线图
- Stream语法详解
- github建站
- 重复元素排列组合问题java简单方法
- Unity+FairyGUI)定义一个回调函数