Eclipse快速上手Hibernate--4. 继承映射(3)

继承

    前两篇文章《Eclipse快速上手Hibernate--4. 继承映射(1) 》和《继承映射(2)》中已经谈了每个类层次结构一个表(table per class hierarchy)与每个子类一个表(table per subclass)的策略,这篇文章主要说的是每个具体类一个表(table per concrete class)。一些重复的部分这里就不说了,请参考前两篇文章。    这个策略很简单,抽象的基类不参与映射,具体子类参与映射。  1. 创建项目 ·  继续沿用上篇文章中所建的Java项目:InheritanceMapping。   2. 编写类文件 ·  新建一个类,包名:javamxj.inheritance.two,类名:Person。然后在生成的代码中添加变量,再利用“生成 Getter 和 Setter”,具体方式同《Eclipse快速上手Hibernate--1. 入门实例 》文章中的编辑User.java的方式一样。·  这个类是父类,要注意,这里并没有将父类映射成表。
Person.java

/* * Hibernate - 继承映射(每个具体类一个表) * 创建日期 2005-4-9 * @author javamxj(分享java快乐) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */package javamxj.inheritance.three;public abstract class Person {private Long id;private String name;/** * @hibernate.id * column="ID" * generator-class="hilo" * unsaved-value="null" */public Long getId() {return id;}public void setId(Long id) {this.id = id;}/** * @hibernate.property * length = "24" */public String getName() {return name;}public void setName(String name) {this.name = name;}}
  ·  子类Student.javaStudent.java

package javamxj.inheritance.three;/** * @hibernate.class * table="Student" */public class Student extends Person {private String studentNumber;/** * @hibernate.property * length = "24" */public String getStudentNumber() {return studentNumber;}public void setStudentNumber(String studentNumber) {this.studentNumber = studentNumber;}}

 ·  子类Professor.javaProfessor.java

package javamxj.inheritance.three;/** * @hibernate.class * table="Professor" */public class Professor extends Person {private int salary;/** * @hibernate.property */public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}}

· 这两个子类都很简单,跟平常的写法相同,只是简单的映射成一个表。 · 好了,这时整个项目的结构如下:    3. 运行任务 ·  双击“generate-hbm”任务,会发现在包中多了Professor.hbm.xml和Student.hbm.xml两个文件。如果没有,按F5键刷新一下(这里建议打开Eclipse的“首选项”对话框,在“工作台”中勾选“自动刷新工作空间”和“在构建之前自动保存”这两项,这样以后不用每次都刷新了)。·  这是通过两个子类所生成的映射文件,注意没有生成父类的映射文件,而且这两个子类的映射文件都已经包含了父类的属性。
Professor.hbm.xml

<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping> <class name="javamxj.inheritance.three.Professor" table="Professor" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version" > <id name="id" column="ID" type="java.lang.Long" unsaved-value="null" > <generator class="hilo"> <!-- To add non XDoclet generator parameters, create a file named hibernate-generator-params-Professor.xml containing the additional parameters and place it in your merge dir. --> </generator> </id> <property name="salary" type="int" update="true" insert="true" access="property" column="salary" /> <property name="name" type="java.lang.String" update="true" insert="true" access="property" column="name" length="24" /> <!-- To add non XDoclet property mappings, create a file named hibernate-properties-Professor.xml containing the additional properties and place it in your merge dir. --> </class></hibernate-mapping>
 
Student.hbm.xml

<?xml version="1.0" encoding="GBK"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping> <class name="javamxj.inheritance.three.Student" table="Student" dynamic-update="false" dynamic-insert="false" select-before-update="false" optimistic-lock="version" > <id name="id" column="ID" type="java.lang.Long" unsaved-value="null" > <generator class="hilo"> <!-- To add non XDoclet generator parameters, create a file named hibernate-generator-params-Student.xml containing the additional parameters and place it in your merge dir. --> </generator> </id> <property name="studentNumber" type="java.lang.String" update="true" insert="true" access="property" column="studentNumber" length="24" /> <property name="name" type="java.lang.String" update="true" insert="true" access="property" column="name" length="24" /> <!-- To add non XDoclet property mappings, create a file named hibernate-properties-Student.xml containing the additional properties and place it in your merge dir. --> </class></hibernate-mapping>
  · 同时在hibernate.cfg.xml文件中会自动添加这两个映射文件信息:<mapping resource="javamxj/inheritance/three/Professor.hbm.xml"/><mapping resource="javamxj/inheritance/three/Student.hbm.xml"/> · 先运行MySQL,然后双击“schemaexport”任务,在项目根目录下,会更新“schema-export.sql”文件。打开这个文件,会发现添加了以下一些语句。 create table Student (   ID bigint not null,   studentNumber varchar(24),   name varchar(24),   primary key (ID))create table Professor (   ID bigint not null,   salary integer,   name varchar(24),   primary key (ID)) ·  切换到数据库中,会发现已经自动产生了数据表Student、Professor。  4. 测试程序 ·  好了,在包javamxj.inheritance.two下新建一个Demo.java类,很简单,前半部分是添加数据,后半部分是简单的测试。
Demo.java

/* * Hibernate - 继承映射(每个具体类一个表) * 创建日期 2005-4-9 * @author javamxj(分享java快乐) * @link Blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */package javamxj.inheritance.three;import java.util.Iterator;import java.util.List;import net.sf.hibernate.HibernateException;import net.sf.hibernate.Session;import net.sf.hibernate.SessionFactory;import net.sf.hibernate.Transaction;import net.sf.hibernate.cfg.Configuration;public class Demo {public static void main(String[] args) {try {new Demo();} catch (HibernateException he) {he.printStackTrace();}}public Demo() throws HibernateException {SessionFactory sf = new Configuration().configure().buildSessionFactory();Session sess = sf.openSession();Transaction tx = null;try {tx = sess.beginTransaction();Student student = new Student();student.setName("张三");student.setStudentNumber("1234554321");sess.save(student);Professor professor = new Professor();professor.setName("李四");professor.setSalary(4300);sess.save(professor);tx.commit();} catch (HibernateException e) {if (tx != null)tx.rollback();throw e;} finally {sess.close();}sess = sf.openSession();tx = null;try {tx = sess.beginTransaction();List person = sess.find("from " + Person.class.getName());for (Iterator it = person.iterator(); it.hasNext();) {Person p = (Person) it.next();System.out.println("人员 '" + p.getName() + "' its class is: "+ p.getClass().getName());}tx.commit();} catch (HibernateException e) {if (tx != null)tx.rollback();throw e;} finally {sess.close();}}}
 ·  运行这个类,控制台输出如下: ·  同时,数据表中生成如下数据:   小结:  ● 优点:· 报表操作实现简单:表中包含了具体子类的所有信息。 ● 缺点:· 类的修改会导致相对应的表及其子类所对应表的更改。· 当含有多重子类时,会造成在数据库表格中生成重复的字段。  参考:· HIBERNATE - 符合Java习惯的关系数据库持久化(第8章)· Hibernate 简化继承映射· Mapping Objects to Relational Databases: O/R Mapping In Detail· Mapping objects to relational databases   下篇文章说说组件(Component)映射。 

时间: 2025-01-02 01:16:23

Eclipse快速上手Hibernate--4. 继承映射(3)的相关文章

Eclipse快速上手Hibernate--2. 利用Hbm映射文件开发

   这篇文章是上篇文章<Eclipse快速上手Hibernate--1. 入门实例>的延续,主要说的是如何利用Hbm映射文件产生普通的Java对象及数据表.可以参考Hibernate自带的文档<HIBERNATE - 符合Java习惯的关系数据库持久化>的第15章--<工具箱指南>一节.同样,这篇文章没有过多谈理论,只是给出了一个完整的实例加以说明.相关配置请参考上篇文章.  1. 创建项目 ·  新建一个Java项目:HibernateBegin_2,注意选中&qu

Eclipse快速上手Hibernate之入门实例

这篇文章主要谈谈Hibernate的入门开发,例子很简单,就是向数据表中添加用户名和密码.我分别使用了三种方法,一种是直接写代码,写Hbm映射文件等:一种是通过Hbm映射文件来生成代码:一种是通过代码来生成Hbm映射文件.使用了一些自动化工具,XMLBuddy是用来编辑XML文件的,JBoss Eclipse IDE是用来编写Doclet标记的.这篇文章还谈到了一些Eclipse的使用技巧,比如建立"用户库"."生成 Getter 和 Setter"等. 关于一些软

Eclipse快速上手Hibernate--3. 利用XDoclet开发

    这篇文章是上两篇文章<Eclipse快速上手Hibernate--1. 入门实例>和<Eclipse快速上手Hibernate--2. 利用Hbm映射文件开发>的延续,主要说的是如何利用XDocletHbm映射文件产生Hbm映射文件及数据表.可以参考XDoclet文档中关于Hibernate的部分和夏昕编写的<Hibernate开发指南>.同样,这篇文章没有过多谈理论,只是给出了一个完整的实例加以说明.相关配置请参考上两篇文章.  1. 创建项目 ·  新建一个

Eclipse快速上手Hibernate--4. 继承映射(1)

继承    前面的<Eclipse快速上手Hibernate--1. 入门实例 >等三篇文章已经谈了Hibernate的入门以及利用工具创建的方法.这篇文章主要说说在Hibernate中的继承映射.相关配置请参考前三篇文章.    如果程序中的对象含有继承的关系,在Hibernate中有以下三种策略将这种关系映射到数据表上:· 每个类层次结构一个表(table per class hierarchy)· 每个子类一个表(table per subclass) · 每个具体类一个表(table

Eclipse快速上手Hibernate--4. 继承映射(2)

继承     上篇文章<Eclipse快速上手Hibernate--4. 继承映射(1) >中已经谈了每个类层次结构一个表(table per class hierarchy)的策略,这篇文章主要说的是每个子类一个表(table per subclass)的策略.一些重复的部分这里就不说了,请参考上篇文章. 1. 创建项目 ·  继续沿用上篇文章中所建的Java项目:InheritanceMapping.   2. 编写类文件 ·  新建一个类,包名:javamxj.inheritance.t

Eclipse快速上手Hibernate--5. 组件映射

    这篇文章主要说的是在Hibernate中的组件(Component)映射,可以参考Hibernate官方文档的第7章.至于环境设置,可以参考这个系列的前面几篇文章.  1. 创建项目 ·  新建一个Java项目:ComponentMapping,注意选中"创建单独的源文件夹和输出文件夹",同时添加"用户库":hibernate.   2. 编写类文件 ·  新建一个类,包名:javamxj.hibernate.component,类名:Person.Pers

Eclipse快速上手Hibernate--1. 入门实例

    这篇文章主要谈谈Hibernate的入门开发,例子很简单,就是向数据表中添加用户名和密码.我分别使用了三种方法,一种是直接写代码,写Hbm映射文件等:一种是通过Hbm映射文件来生成代码:一种是通过代码来生成Hbm映射文件.使用了一些自动化工具,XMLBuddy是用来编辑XML文件的,JBoss Eclipse IDE是用来编写Doclet标记的.这篇文章还谈到了一些Eclipse的使用技巧,比如建立"用户库"."生成 Getter 和 Setter"等.  

Eclipse快速上手指南

Eclipse是一款非常优秀的开源IDE,非常适合Java开发,由于支持插件技术,受到了越来越多的开发者的欢迎.最新的Eclipse 3.0不但界面作了很大的增强,而且增加了代码折叠等众多优秀功能,速度也有明显的提升.配合众多令人眼花缭乱的插件,完全可以满足从企业级Java应用到手机终端Java游戏的开发.本文将带您手把手步入Eclipse的广阔天地,详细介绍在Eclipse下如何开发普通Java程序,Web应用,J2EE应用,手机Java程序,以及如何进行单元测试,重构,配置CVS等详细内容.

Eclipse快速上手指南之使用CVS

版本控制在团队开发中是必不可少的.CVS是优秀的开源版本控制软件,Eclipse本身就内置了对CVS的支持,只需简单配置,即可使用CVS. 首先我们要正确安装并配置好CVS服务器,通常Linux Server都自带CVS服务,不过命令行操作比较繁琐.Windows下也有简单易用的CVS服务器,这里我们推荐CVSNT,可以下载CVSNT 2.0.51a,安装并启动CVSNT: 然后切换到Repositories面板,添加一个Repository,命名为/cvs-java,CVSNT会提示是否初始化