Hibernate 中如何保存继承树
现有三个类。Person,Manager,Clerk,它们对应于数据库中的同一张表Tperson. Manager和Clerk是Person的子类。
类Person的代码如下:
package com.sorun.inherit.bean;
public class Person {
private Long id;
private String name;
private String type;
/**
* @return Returns the id.
*/
public Long getId() {
return id;
}
/**
* @param id The id to set.
*/
public void setId(Long id) {
this.id = id;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
/**
* @return Returns the type.
*/
public String getType() {
return type;
}
/**
* @param type The type to set.
*/
public void setType(String type) {
this.type = type;
}
}
类Manager和类Clerk只是简单的继承Person类。
代码 (Manager.java)
package com.sorun.inherit.bean;
public class Manager extends Person {
}
代码(Clerk.java)
package com.sorun.inherit.bean;
public class Clerk extends Person {
}
映射文件person.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping
package="com.sorun.inherit.bean">
<class name="Person" table="Tperson" discriminator-value="P"
>
<!-- -->
<id name="id">
<generator class="identity"/>
</id>
<!-- 试一下将force设为false效果会怎样? -->
<discriminator type="char" column="type" force="true"/>
<property name="name" not-null="true"/>
<subclass name="Manager"
discriminator-value="M"/>
<subclass name="Clerk"
discriminator-value="C"/>
</class>
</hibernate-mapping>
测试用例:
package com.sorun.inherit.test;
import java.util.Iterator;
import java.util.List;
import net.sf.hibernate.Query;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import org.apache.log4j.Logger;
import com.sorun.inherit.bean.Manager;
import com.sorun.inherit.bean.Person;
import com.sorun.inherit.database.SessionFactory;
public class Main {
public static void main(String[] args)throws Exception {
Logger log=Logger.getLogger(Main.class);
Person manager=new Manager();
manager.setName("test");
Session session=SessionFactory.getSession();
Transaction trans=session.beginTransaction();
session.save(manager);
trans.commit();
Query query=session.createQuery("from Person as person");
List list=query.list();
Iterator iterator=list.iterator();
while (iterator.hasNext()){
Person person=(Person)iterator.next();
log.info(person);
}
session.close();
}
}
输出结果:
Hibernate: insert into Tperson (name, type) values (?, 'M') select SCOPE_IDENTITY()
Hibernate: select person0_.id as id, person0_.type as type, person0_.name as name from Tperson person0_ where person0_.type in ('P', 'C', 'M')
##<2004/09/13 14:35:687><INFO><com.sorun.inherit.test.Main>(Main.java:42)<com.sorun.inherit.bean.Manager@15fc40c>
##<2004/09/13 14:35:687><INFO><com.sorun.inherit.test.Main>(Main.java:42)<com.sorun.inherit.bean.Manager@401369>
##<2004/09/13 14:35:687><INFO><com.sorun.inherit.test.Main>(Main.java:42)<com.sorun.inherit.bean.Manager@1a7ddcf>
Eclipse3.0 + Hibernate2.1.6 +SqlServer2000 +Windows2000