hibernate元件對映和繼承對映
阿新 • • 發佈:2019-01-24
元件對映
類的關係:
wheel.java
public class Wheel {
private String brandname;
private int size;
}
Car.java
public class Car {
private int id;
private String name;
private Wheel wheel;
}
對映檔案:元件中使用的關鍵字是 component
繼承對映<hibernate-mapping package="lin.hibernate_03.d_component"> <class name="Car" table="car03"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="name" column="name" length="20"></property> <component name="wheel" class="Wheel"> <property name="brandname" column="brandname"></property> <property name="size" column="size" ></property> </component> </class> </hibernate-mapping>
0.簡單對映
注意:當Animal的子類有很多的時候,就會有很多子類對應的表,那麼如何查詢出來所有的
Animal子類物件的記錄?HQL “FROM Animal”,此時報錯為沒有指定的hbm檔案,因此需要
在HQL語句查詢的時候指定全類名。HQL “fromcn.itcast.extend.Animal”即可
1.繼承結構使用一張表:
類的關係:
Animal.java
public class Animal {
private int id;
private String name;
}
Cat.java
public class Cat extends Animal{ private String catchmouse; } Monkey.java
public class Monkey extends Animal{
private String eatBanana;
}
對映檔案:要配置discriminator,否則報錯<hibernate-mapping package="lin.hibernate_03.e_exteends1">
<class name="Animal" table="animal03"> <id name="id" column="id"> <generator class="native"></generator> </id> <discriminator column="type_"></discriminator>// 建立type_欄位,區分表中的關係 <property name="name" length="20"></property> <!-- 子類:cat --> <subclass name="Cat" discriminator-value="cat">// 給type_欄位賦值,該預設值是類的全名 <property name="catchmouse"></property> </subclass> <!-- 子類:monkey --> <subclass name="Monkey" discriminator-value="monkey" > <property name="eatBanana"></property> </subclass> </class> </hibernate-mapping>
執行結果:
寫法較為簡單:所有子類用一個對映檔案,且對映到一張表!但資料庫設計不合理!(不推薦用。)
2.每個類一張表
類的關係:
同上。
對映檔案:關鍵字是:joined-subclass
<hibernate-mapping package="lin.hibernate_03.e_exteends2">
<class name="Animal" table="animal03">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" length="20"></property>
<!-- 子類:cat -->
<joined-subclass name="Cat">
<key column="cat_id"></key>
<property name="catchmouse" ></property>
</joined-subclass>
<!-- 子類:monkey -->
<joined-subclass name="Monkey">
<key column="monkey_type"></key>
<property name="eatBanana" ></property>
</joined-subclass>
</class>
</hibernate-mapping>
執行結果:
一個對映檔案,儲存所有的子類; 子類父類都對應表;缺點:表結構比較複雜,插入一條子類資訊,需要用2條sql:往父類插入、往子類插入!
3.父類不對應表
類的關係:
同上。
對映檔案:關鍵字是“union-subclass”
<hibernate-mapping package="lin.hibernate_03.e_exteends3">
<class name="Animal" abstract="true">// abstract意思該類是抽象類,是不建立表,在Animal.java,public後面不需要寫“abstract”
<id name="id" column="id">
<generator class="uuid"></generator>// 主鍵生成策略,不能再用“native”,需要手動生成或“uuid”
</id>
<property name="name" length="20"></property>
<!-- 子類:Cat -->
<union-subclass name="Cat" table="cat_">
<property name="catchmouse"></property>
</union-subclass>
<!-- 子類:Monkey -->
<union-subclass name="Monkey" table="monkey_">
<property name="eatBanana"></property>
</union-subclass>
</class>
</hibernate-mapping>
執行結果:
所有的子類都寫到一個對映檔案;父類不對應表; 每個子類對應一張表