欢迎光临
我们一直在努力

Eclipse快速上手Hibernate–4. 继承映射(2)-JSP教程,Java技巧及代码

建站超值云服务器,限时71元/月

    上篇文章《eclipse快速上手hibernate–4. 继承映射(1) 》中已经谈了每个类层次结构一个表(table per class hierarchy)的策略,这篇文章主要说的是每个子类一个表(table per subclass)的策略。一些重复的部分这里就不说了,请参考上篇文章。 1. 创建项目 ·  继续沿用上篇文章中所建的java项目:inheritancemapping。   2. 编写类文件 ·  新建一个类,包名:javamxj.inheritance.two,类名:animal。然后在生成的代码中添加变量,再利用“生成 getter 和 setter”,具体方式同《eclipse快速上手hibernate–1. 入门实例 》文章中的编辑user.java的方式一样。·  这个类是父类,只是生成一个简单的表。
vehicle.java

/* * hibernate – 继承映射(每个子类一个表) * 创建日期 2005-4-9 * @author javamxj(分享java快乐) * @link blog: htpp://javamxj.mblogger.cn * htpp://blog.csdn.net/javamxj/ */package javamxj.inheritance.two;/** * @hibernate.class */public class vehicle { 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; }}
 ·  子类car.javacar.java

package javamxj.inheritance.two;/** * @hibernate.joined-subclass * @hibernate.joined-subclass-key * column="id" */public class car extends vehicle { private string seat; /** * @hibernate.property * column = "载客" * length = "24" */ public string getseat() { return seat; } public void setseat(string seat) { this.seat = seat; }}

 ·  子类truck.javatruck.java

package javamxj.inheritance.two;/** * @hibernate.joined-subclass * @hibernate.joined-subclass-key * column="id" */public class truck extends vehicle { private string load; /** * @hibernate.property * column = "载重" * length = "24" */ public string getload() { return load; } public void setload(string load) { this.load = load; }}

· 这两个子类都很简单,注意添加的hibernate.joined-subclass的标记。 · 好了,这时整个项目的结构如下:  3. 运行任务 ·  双击“generate-hbm”任务,会发现在包中多了一个vehicle.hbm.xml文件。如果没有,按f5键刷新一下(这里建议打开eclipse的“首选项”对话框,在“工作台”中勾选“自动刷新工作空间”和“在构建之前自动保存”这两项,这样以后不用每次都刷新了)。
vehicle.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.two.vehicle" 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-vehicle.xml containing the additional parameters and place it in your merge dir. –> </generator> </id> <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-vehicle.xml containing the additional properties and place it in your merge dir. –> <joined-subclass name="javamxj.inheritance.two.truck" dynamic-update="false" dynamic-insert="false" > <key column="id" /> <property name="load" type="java.lang.string" update="true" insert="true" access="property" column="载重" length="24" /> </joined-subclass> <joined-subclass name="javamxj.inheritance.two.car" dynamic-update="false" dynamic-insert="false" > <key column="id" /> <property name="seat" type="java.lang.string" update="true" insert="true" access="property" column="载客" length="24" /> </joined-subclass> </class></hibernate-mapping>

· 重点是看看“joined-subclass”标签。 · 同时在hibernate.cfg.xml文件中会自动添加一个映射文件信息:<mapping resource="javamxj/inheritance/two/vehicle.hbm.xml"/>  ·  先运行mysql,然后双击“schemaexport”任务,在项目根目录下,会更新“schema-export.sql”文件。打开这个文件,会发现添加了以下一些语句。create table car (   id bigint not null,   载客 varchar(24),   primary key (id))create table truck (   id bigint not null,   载重 varchar(24),   primary key (id))create table vehicle (   id bigint not null,   name varchar(24),   primary key (id)) ·  切换到数据库中,会发现已经自动产生了数据表car、truck、vehicle。 · 将数据表与映射文件vehicle.hbm.xml对照看看,可以更好的理解每个子类一个表的策略。  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.two;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(); car car = new car(); car.setname("奇瑞qq"); car.setseat("4人"); sess.save(car); truck truck = new truck(); truck.setname("一汽解放"); truck.setload("10吨"); sess.save(truck); 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 pets = sess.find("from " + vehicle.class.getname()); for (iterator it = pets.iterator(); it.hasnext();) { vehicle vehicle = (vehicle) it.next(); system.out.println("车型 " + vehicle.getname() + " its class is: " + vehicle.getclass().getname()); } tx.commit(); } catch (hibernateexception e) { if (tx != null) tx.rollback(); throw e; } finally { sess.close(); } }}
 ·  运行这个类,控制台输出如下: ·  同时,数据表中生成如下数据:    小结:  ● 优点:· 与面向对象的概念的一致性最好。对多态的支持最好,对于对象所可能充当的角色仅需要在相应的表中保存记录。· 易于修改基类和增加新的类。· 这种映射几乎有最佳的空间节约性。唯一的容易就是额外的oid,来连接不同的层级层次。 ● 缺点:· 数据库中存在大量的表。· 访问数据的时间较长。在读写相关的任务上,这种映射方式相当费资源,这个代价还随着继承层次的增多而增大。 · 对报表的支持较差,除非定义视图。 参考:· hibernate – 符合java习惯的关系数据库持久化(第8章)· hibernate 简化继承映射· mapping objects to relational databases: o/r mapping in detail· mapping objects to relational databases   下篇文章会谈谈每个具体类一个表的策略。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Eclipse快速上手Hibernate–4. 继承映射(2)-JSP教程,Java技巧及代码
分享到: 更多 (0)

相关推荐

  • 暂无文章