继承关系中的第三种方式:利用<union-subclass>
代码:
映射文件(其他的代码和其他继承关系相同)
Person.hbm.xml
<?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.union">
<class name="Person" table="t_person">
<id name="id" column="t_id"> <generator class="hilo"/> </id>
<property name="name" column="t_name"/> <property name="date" column="t_date"/>
<!-- 配置继承关系 (利用union-subclass进行)-->
<union-subclass name="Teacher" table="TEACHER">
<property name="job"/>
</union-subclass>
</class>
</hibernate-mapping>
|
执行结果:
进行Save操作的结果:
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, t_id) values (?, ?, ?) Hibernate: insert into TEACHER (t_name, t_date, job, t_id) values (?, ?, ?, ?)
|
只有两条记录,说明还是比较方便的。
获取对象的操作的执行结果:
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 t2_0_0_, person0_.t_date as t3_0_0_, person0_.job as job1_0_, person0_.clazz_ as clazz_0_ from ( select t_id, t_name, t_date, null as job, 0 as clazz_ from t_person union select t_id, t_name, t_date, job, 1 as clazz_ from TEACHER ) person0_ where person0_.t_id=? 名字是:AAA Hibernate: select teacher0_.t_id as t1_0_0_, teacher0_.t_name as t2_0_0_, teacher0_.t_date as t3_0_0_, teacher0_.job as job1_0_ from TEACHER teacher0_ where teacher0_.t_id=? 工作是:Teacher
|
通过这样的执行结果可以看出:在执行子类的查询的时候只是访问的是子类的表,但是进行父类的查询的时候却是进行的两张表的查询。这是比较麻烦的事情。
但是这是这种方式<union-subclass>的一种优势。