您的位置:首页 > 其它

Hibernate学习笔记:继承映射之每个子类一张表,使用辨别标志

2009-08-31 10:10 639 查看
继承映射之每个子类一张表,使用辨别标志:父类和子类分放在不同的表中,子类通过父类id与父类关联,父类有一个字段来标名该纪录是哪个子类。只有父类有配置文件,父类中通过subclass -> join标识子类。
前面的每个子类一张表为基础,表关系保持不变,给animal1表添加一个字段animal_type: alter table animal1 add animal_type varchar(10), 该字段用来表明animal是哪种动物。pojo,dao都保持不变。只需要修改一下映射文件:
Animal.hbm.xml:
<hibernate-mapping package="model">
<class name="Animal" table="animal1" schema="dbo" catalog="hibernate">
<id name="id" column="id">
<generator class="native" />
</id>
<discriminator column="animal_type" type="string" />
<property name="name" />
<many-to-one name="zoo" class="model.Zoo" column="zoo_id" />
<subclass name="model.Monkey" discriminator-value="MONKEY">
<join table="monkey">
<key column="animal_id" />
<property name="age" />
</join>
</subclass>
<subclass name="model.Tiger" discriminator-value="TIGER">
<join table="tiger">
<key column="animal_id" />
<property name="kind" />
</join>
</subclass>
</class>
</hibernate-mapping>
<!--
alter table animal1 add animal_type varchar(10)
update animal1 set animal_type='TIGER' where id >=6
alter table animal1 alter column animal_type varchar(10) not null
-->


测试用例:

public static void main(String[] args){
AnimalDao dao = new AnimalHibernateDao();
List l = dao.listMonkdy();
System.out.println(l.size());
Monkey m = new Monkey();
Zoo z = dao.getZooById(1);
m.setAge(14);
m.setName("jinggang");
m.setZoo(z);
dao.save(m);
}


可以看到,当insert的时候,产生两条sql:

insert into animal1 (name, zoo_id, animal_type) values (?, ?, 'MONKEY')
insert into monkey (age, animal_id) values (?, ?)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐