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

被折叠的 条评论
为什么被折叠?



