人类(Person) , 男人(Men)继承"人"类, 女人(Women)继承"人"类, UML如下:
映射到三张表
, 每个子类扩展的属性单独保存在一张表中
t_person2表
:
1 int id //主键
2 varchar name //父类中的姓名
3 int age //父类中的年龄
t_men2表:
1 int person_id //主键,外键
2 varchar a //Men类扩展的属性a
t_women2表:
1 int person_id //主键,外键
2 varchar b //Women类扩展的属性b
Person, Men, Women 三个类这里就不显示了,但简单, 想看了附件中有源码
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="extends_test.extends_2" auto-import="false">
<class name="Person" table="t_person2" discriminator-value="0"><!-- "鉴别值"为0 -->
<!-- 父类的属性 -->
<id name="id">
<generator class="native"/>
</id>
<!-- 父类的属性 -->
<property name="name"/>
<!-- 父类的属性 -->
<property name="age"/>
<!-- Mem子类的映射 -->
<joined-subclass name="Men" table="t_men2"><!-- table="t_men2"是表名 -->
<!-- 外键的字段名-->
<key column="person_id"></key>
<!-- Men类专有的属性a -->
<property name="a"/>
</joined-subclass>
<!-- Women子类的映射 -->
<joined-subclass name="Women" table="t_women2"><!-- table="t_men2"是表名 -->
<!-- 外键的字段名-->
<key column="person_id"></key>
<!-- Men类专有的属性a -->
<property name="b"/>
</joined-subclass>
</class>
</hibernate-mapping>
保存与查询操作:
package extends_test.extends_2;
import org.hibernate.Session;
import org.hibernate.Transaction;
import dao.HibernateUtil;
/**
* 继承关系的映射(方法二)
*
* 映射到三张表 , 每个子类扩展的属性单独保存在一张表中
*
* 共分的部分(父类的属性)放一张表中
*
*/
public class Test
{
/**
* @param args
*/
public static void main(final String[] args)
{
add();
query();
}
/**
* 查询测试
*/
public static void query()
{
Session session = null;
try
{
session = HibernateUtil.getSeesion();
final Person p = (Person) session.get(Person.class, 2); //ID为2的记录是 Men类型
System.out.println(p.getClass());
//get()第一个参数用了 Person.class
//能识别出是class extends_test.extends_1.Men类型
}
finally
{
if (session != null)
{
session.close();
}
}
}
/**
* 添加测试
*/
public static void add()
{
final Person p1 = new Person();
p1.setName("我是Person类");
final Men m1 = new Men();
m1.setName("我是男人类");
m1.setA("a");
final Women w1 = new Women();
w1.setName("我是女人类");
w1.setB("b");
Session session = null;
try
{
session = HibernateUtil.getSeesion();
final Transaction tx = session.beginTransaction();
session.save(p1);
session.save(m1);
session.save(w1);
tx.commit();
//SQL如下
//Hibernate: insert into t_person2 (name, age) values (?, ?)
//Hibernate: insert into t_person2 (name, age) values (?, ?)
//Hibernate: insert into t_men2 (a, person_id) values (?, ?)
//Hibernate: insert into t_person2 (name, age) values (?, ?)
//Hibernate: insert into t_women2 (b, person_id) values (?, ?)
//Hibernate: select person0_.id as id9_0_, person0_.name as name9_0_, person0_.age as age9_0_, person0_1_.a as a10_0_, person0_2_.b as b11_0_, case when person0_1_.person_id is not null then 1 when person0_2_.person_id is not null then 2 when person0_.id is not null then 0 end as clazz_0_ from t_person2 person0_ left outer join t_men2 person0_1_ on person0_.id=person0_1_.person_id left outer join t_women2 person0_2_ on person0_.id=person0_2_.person_id where person0_.id=?
//class extends_test.extends_2.Men
}
finally
{
if (session != null)
{
session.close();
}
}
}
}
分享到:
相关推荐
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...
1.设计模式更抽象,J2EE 是具体的产品代码,我们可以接触到,而设计模式在对每个应用时才会产生具体代码。 2.设计模式是比 J2EE 等框架软件更小的体系结构,J2EE 中许多具体程序都是应用设计模式来完成的,当你深入...
3、FACTORY METHOD —请 MM 去麦当劳吃汉堡,不同的 MM 有不同的口味,要每个都记住 、 是一件烦人的事情,我一般采用 Factory Method 模式,带着 MM 到服务员那儿,说“要一个 汉堡”,具体要什么样的汉堡呢,让 ...
化时,每个对象分配有一个"引用"(reference)保存到一个实例变量中。"引用" 实际上是一个指针,此指针指向对象所占有的内存区域。 因此,对象名(变量)实际上存放的是一个被实例化之后的对象所占有的内存区域 的...
其中save(FileActionForm fileForm)方法,将封装在fileForm中的上传文件保存到数据库中,这里我们使用FileActionForm作为方法入参,FileActionForm是Web层的表单数据对象,它封装了提交表单的数据。将...
13、责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。 客户并不知道链上的哪一个对象最终处理这个请求,系统可以...
每个类都打包于一个命名空间。命名空间的概念和 C++ 完全一样,但我们在 C# 中比在 C++ 中更加频繁的使用命名空间。你可以用点(.)定界符访问命名空间中的类。上面的 Hello World 程序中,MyNameSpace 是其命名空间...
每个Thread对象描述了一个单独的线程。要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法; ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法。 为什么...
在 SQL Server 2005 中使用表值函数来实现空间数据库 SQL Server 2005的30个最重要特点 同时安装sql2000和sql2005的经验 类如何与界面绑定 在Asp.net中如何用SQLDMO来获取SQL Server中的对象信息 使用Relations建立...
子类继承父类,单独完全可以运行 依赖倒转原则: 引用一个对象,如果这个对象有底层类型,直接引用底层类型 接口隔离原则: 每一个接口应该是一种角色 合成/聚合复用原则: 新的对象应使用一些已有的对象,使之成为...
27.修改了新闻系统批量设置属性时各属性不能分开单独设置的问题 28.修改了修改新闻时更换扩展名之后,不能删除原静态文件的问题 29.增加了新闻、审核投稿、采集入库时新闻newsid是否重复的验证 30.修改会员登录标签...