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

hibernate單表之元件對映和繼承對映

表結構:

Create table customer(
	id int primary key,
	name varchar(15),
	home_street varchar(255),
	home_city varchar(255),
	home_province varchar(255),
	home_zipcode varchar(255),
	com_street varchar(255),
	com_city varchar(255),
	com_province varchar(255),
	com_zipcode varchar(255),
)
JavaBean: Customer
public class Customer {
	private Integer id;
	private String name;
	private Address homeAddress;
	private Address comAddress;
}
JavaBean: Address
public class Address {
	private String street;
	private String city;
	private String province;
	private String zipcode;
	private Customer customer;  // 指定Address類屬於Customer類
}
Customer.hbm.xml
<hibernate-mapping>
	<class name="cn.itcast.component.Customer" table="customers">
		<id name="id" type="integer">
			<column name="id"></column>
			<generator class="increment"></generator>
		</id>
		<property name="name" type="string" access="property">
			<column name="name"></column>
		</property>
		<!-- 
			配置元件對映
			component標籤: 表示Address類是Customer類的組成祖墳,在hibernate中稱之為元件
		 -->
		<component name="homeAddress" class="cn.itcast.component.Address">
			<parent name="customer"/>
			<property name="city" column="home_city"></property>
			<property name="street" column="home_street"></property>
			<property name="zipcode" column="home_zipcode"></property>
			<property name="province" column="home_province"></property>
		</component>
		<component name="comAddress" class="cn.itcast.component.Address">
			<parent name="customer"/>
			<property name="city" column="com_city"></property>
			<property name="street" column="com_street"></property>
			<property name="zipcode" column="com_zipcode"></property>
			<property name="province" column="com_province"></property>
		</component>
	</class>
</hibernate-mapping>
1. 採用subclass元素的繼承對映
   父類和子類使用同一張表 (公司有普通員工, 鐘點工, 正式員工)  -- 一張表
Javabean:

public class Employee{
	private Integer id;
	private String name;
}
public class HourEmployee extends Employee{
	private double rate;
}
public class SalaryEmployee extends Employee{
	private Double salary;
}
欄位意思:
id:員工編號
etype:員工型別 (he 小時工,se 正式員工,ee剛入職的員工)
name:員工姓名
rate:小時工的工資
salary:正式員工的工資

Employee.hbm.xml

<hibernate-mapping>
	<class name="cn.itcast.Employee" table="employee" discriminator-value=”ee”>
		<id name="id" type="integer">
			<column name="id"></column>
			<generator class="increment"></generator>
		</id>
		<!--辨別者列,column=”etype”用於區分員工的種類,該配置必須放置在id的後面-->
		<discriminator column=”etype” type=”string”/>
		<property name="name" type="string" access="property">
			<column name="name"></column>
		</property>
		<!-- 
			配置子類
			discriminator-value: 子類對應的辨別者列的值
		 -->
		<subclass name="cn.itcast.HourEmployee" discriminator-value="he">
			<property name="rate" column="rate" type=”double”></property>
		</subclass>
		<subclass name="cn.itcast.SalaryEmployee" discriminator-value="se">
			<property name="salary" column="salary" type=”double”></property>
		</subclass>
	</class>
</hibernate-mapping>
2. 採用joined-subclass元素的繼承對映
    三張表 javabean同上,表和表之間存在主表和次表的概念
Employee.hbm.xml

<hibernate-mapping>
	<class name="cn.itcast.Employee" table="e_emp">
		<id name="id" type="integer">
			<column name="id"></column>
			<generator class="increment"></generator>
		</id>
		<property name="name" type="string" access="property">
			<column name="name"></column>
		</property>
		<!-- 
			joined-subclass: 用於對映HourEmployee類
			table: 子類對應的表的名稱
			key子元素: 指定h_emp表中既作為主鍵又作為外來鍵eid列
			property: table屬性指定表中的列
		 -->
		<joined-subclass name="cn.itcast.HourEmployee" table="h_emp">
			<key column=”eid”/>
			<property name="rate" column="rate" type=”double”/>
		</joined-subclass >
		<joined-subclass name="cn.itcast.SalaryEmployee" table="s_emp">
			<key column=”sid”/>
			<property name="salary" column="salary" type=”double”/>
		</joined-subclass >
	</class>
</hibernate-mapping>