继承映射、多态查询
通过hibernate如何实现继承,有三种方式:
1):每个子类一张表。每个子类对应一个hbm.xml文件,但是父类没有对应的hbm.xml文件。
Public class Parent implements Serilizable{
Private Long id;//主键
Private String name;
...setter/getter...
}
Public class Child1 implmemts Parent,Serilizable{
Private String cardNumber;
}
Public class Son implements Parent,Serilizable{
Private String loves;
}
Child1.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>
<class name= “Child1” table = “child_”>
<!--继承父类的id,这里的继承并不是通过私有属性继承的,私有的属性是无法继承的,而是通过对应的getter/setter方法继承过来的-->
<id name= “id” column = “id” type = “long”>
<generator class = “increment”/>
</id>
<!--配置继承了父类的属性-->
<property name = “name” column = “name” type = “string”/>
<!--配置自己的属性-->
<property name= “cardNumber” column = “cardNumber” type = “string”/>
</class>
</hibernate-mapping>
对于Som.hbm.xml一样的进行配置
多态查询
Public void test(){
SessionFactory factory = new Configuration().configure();
Session session = factory.openSession();
Transaction tx = null;
Try{
Tx = session.beginTransaction();
//注意这里并没有Parent.hbm.xml文件,因此在查询时,需要写全名,多态查询
Query query = session.createQuery(“from com.test.Parent”);
List<Parent> list = (List<Parent>)query.list();
For(Parent p :list){
If(p instanceOf Child1){
//这里得到的就是Child1对象
}else if(p instanceOf Son){
//这里得到的就是Son对象
}
}
Tx.commit();
}catch(Exception e){
If(null != tx)
tx.rollBack();
}finally{
If(null != session)session.close();
}
}
2):所有的子类都在同一个表中(会造成字段浪费),只针对父类有hbm.xml,其余没有
Parent.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>
<class name= “Parent” table= “parent_”>
<id name= “id” column = “id” type = “long”>
<generator class = “increment”/>
</id>
<!--配置父类的属性-->
<property name= “name” column = “name” type = “string”/>
<!-- 配置继承了该父类的子类的所有字段name为子类的名字,同时要配合元素discriminator指定一个区分值 -->
<subclass name="Child1" discriminator-value="child1">
<property name="cardNumber" column="cardNumber" type="string">
</property>
</subclass>
<subclass name="Son" discriminator-value="son">
<property name="loves" column="loves" type="string">
</property>
</subclass>
</class>
</hibernate-mapping>
3):父类信息放置在一张表中,每个子类都有自己的表,但存放自己独有的东西。
...略....