1. 程式人生 > >hibernate元件對映和繼承對映

hibernate元件對映和繼承對映

元件對映

類的關係:

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>
執行結果:


所有的子類都寫到一個對映檔案;父類不對應表; 每個子類對應一張表