CREATE TABLE defaultuser ( id INT(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(100) NOT NULL default '', someProperty VARCHAR(100) ); CREATE TABLE poweruser ( id INT(11) NOT NULL auto_increment PRIMARY KEY, name VARCHAR(100) NOT NULL default '', otherProperty VARCHAR(100) );而类别的设计如下:
package onlyfun.caterpillar;
public class User {
private Integer id;
private String name;
// 必須要有一個預設的建構方法
// 以使得Hibernate可以使用Constructor.newInstance()建立物件
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package onlyfun.caterpillar;
public class DefaultUser extends User {
private String someProperty;
public DefaultUser() {
}
public String getSomeProperty() {
return someProperty;
}
public void setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
}
package onlyfun.caterpillar;
public class PowerUser extends User {
private String otherProperty;
public PowerUser() {
}
public String getOtherProperty() {
return otherProperty;
}
public void setOtherProperty(String otherProperty) {
this.otherProperty = otherProperty;
}
}
在映射文件方面分别如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.DefaultUser" table="defaultuser">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="someProperty" column="someProperty" type="java.lang.String"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>当然,别忘了在hibernate.cfg.xml中定义使用这两个映射文件:
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.PowerUser" table="poweruser">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="otherProperty" column="otherProperty" type="java.lang.String"/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>在储存对象时很简单,例如分别储存DefaultUser与PowerUser的实例:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
...
<!-- 物件與資料庫表格映射文件 -->
<mapping resource="onlyfun/caterpillar/DefaultUser.hbm.xml"/>
<mapping resource="onlyfun/caterpillar/PowerUser.hbm.xml"/>
</session-factory>
</hibernate-configuration>
DefaultUser defaultUser = new DefaultUser(); defaultUser.setName("Bush"); defaultUser.setSomeProperty("hu....hu..."); PowerUser powerUser = new PowerUser(); powerUser.setName("caterpillar"); powerUser.setOtherProperty("Bla...Bla..."); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); session.save(powerUser); session.save(defaultUser); tx.commit(); session.close();至于查询方面,视您想查询哪个数据表,如果想同时查询User类对应的所有资料,则可以如下:
Session session = sessionFactory.openSession(); Query query = session.createQuery("from onlyfun.caterpillar.User"); Iterator iterator = query.list().iterator(); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getName()); } session.close();这个查询会找出所有User之子类别所对应之数据,Hibernate实际上会使用以下的SQL进行查询:
Hibernate: select defaultuse0_.id as id, defaultuse0_.name as name0_, defaultuse0_.someProperty as someProp3_0_ from defaultuser defaultuse0_ Hibernate: select poweruser0_.id as id, poweruser0_.name as name1_, poweruser0_.otherProperty as otherPro3_1_ from poweruser poweruser0_也就是Hibernate自动判断User的继承关系,并分别对DefaultUser与PowerUser对应的表格进行查询。