15 继承(二)(每个子类扩展的属性单独保存在一张表中)

UML与Hibernate继承映射
本文介绍了一种使用UML表示的人类、男人、女人类之间的继承关系,并通过Hibernate框架将其映射到数据库的实现方式。具体展示了如何将继承结构映射到多张表中,同时介绍了相应的Java代码实现。


人类(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();
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值