hibernate中的几种映射

一. 复合主键映射

1)类中的每一个主键属性都对应到数据库表中的每一个主键列。Hibernate要求联合主键的实体实现Serializable接口,并且重写hashCodeequals方法,原因在于使用getload方法的时候需要先构建出来该实体的对象,并且将查询依据(联合主键)设置进去,然后作为get或者load方法的第二个参数传进去即可。重写这两个方法的原因在于Hibernate要根据数据库的联合主键来判断某两行记录是否是一样的,如果一样那么就认为是同一个对象,如果不一样,那么就认为是不同对象。

2)将主键所对应的属性提出一个类(称之为主键类)

<?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="com.chm.test.Student" table="student">
<composite-id>
<key-property name="idcard" column="idcard" type="integer"></key-property>
<key-property name="name" column="name" type="string"></key-property>
</composite-id>

<property name="age" column="age" type="integer"></property>

</hibernate-mapping>
也可以将主键属性单独提取出来一个类,并在composite-id标签上指明即可.


二. 组件映射

1.使用component标签

<class name="com.chm.test.Student" table="student">
		<id name="id" column="id" type="integer">
			<generator class="increment"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="integer"></property>
		<component name="addres" class="com.chm.test.Address">
			<property name="homeAddr" column="homeAddr" type="string"></property>
			<property name="schoolAddr" column="schoolAddr" type="string"></property>
		</component>
	</class>
所有属性存在一张表中.生成sql语句为:create table student (id integer not null, name varchar(255), age integer, homeAddr varchar(255), schoolAddr varchar(255), primary key (id));

2.使用composite-element标签(了解)

<class name="com.chm.test.Student" table="student">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="age" column="age" type="integer"></property>
		<set name="contacts" table="contact">
			<key column="student_id"></key>
			<composite-element class="com.chm.test.Contact">
				<property name="method" column="method" type="string"></property>
				<property name="address" column="address" type="string"></property>
			</composite-element>
		</set>
	</class>

生成两张表,生成的sql为:create table contact (student_id varchar(255) not null, method varchar(255), address varchar(255));
create table student (id varchar(255) not null, name varchar(255), age integer, primary key (id));
alter table contact add index FK38B724203B7CAEB1 (student_id), add constraint FK38B724203B7CAEB1 foreign key (student_id) references student (id);

三. 继承映射

Student类和Teacher类都继承Person,Person类中有公共属性id和name,Student中有单独属性cardid,Teacher类中有单独属性salary

1)每个子类一张表

Student.hbm.xml

<class name="com.chm.test.Student" table="student">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="cardid" column="cardid" type="string"></property>
	</class>
Teacher.hbm.xml

<class name="com.chm.test.Teacher" table="teacher">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		<property name="salary" column="salary" type="int"></property>
	
	</class>
注意:多态查询的时候HQL为 "from com.chm.test.Person",因为Person没有对应的hbm文件,所以 类要带上包名.

2)一张表存储继承体系中所有类的信息

Person.hbm.xml文件:

<class name="com.chm.test.Person" table="person">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<discriminator column="personType" type="string"></discriminator>
		<property name="name" column="name" type="string"></property>
		
		<subclass name="com.chm.test.Student" discriminator-value="student">
			<property name="cardid" column="cardid" type="string"></property>
		</subclass>
		<subclass name="com.chm.test.Teacher" discriminator-value="teacher">
			<property name="salary" column="salary" type="string"></property>
		</subclass>
    </class>

生成表的sql语句为:create table person (id varchar(255) not null, personType varchar(255) not null, name varchar(255), cardid varchar(255), salary varchar(255), primary key (id));

3)每个类一张表,公共信息放在父类表中

Person.hbm.xml文件:

<class name="com.chm.test.Person" table="person">
		<id name="id" column="id" type="string">
			<generator class="uuid"></generator>
		</id>
		<property name="name" column="name" type="string"></property>
		
		<joined-subclass name="com.chm.test.Student" table="student">
			<key column="id"></key>
			<property name="cardid" column="cardid" type="string"></property>
		</joined-subclass>
		
		<joined-subclass name="com.chm.test.Teacher" table="teacher">
			<key column="id"></key>
			<property name="salary" column="salary" type="string"></property>
		</joined-subclass>
    </class>

create table person (id varchar(255) not null, name varchar(255), primary key (id));
[hibernatetool] create table student (id varchar(255) not null, cardid varchar(255), primary key (id));
[hibernatetool] create table teacher (id varchar(255) not null, salary varchar(255), primary key (id));
[hibernatetool] alter table student add index FK8FFE823BAB5FC6B9 (id), add constraint FK8FFE823BAB5FC6B9 foreign key (id) references person (id);
[hibernatetool] alter table teacher add index FKAA31CBE2AB5FC6B9 (id), add constraint FKAA31CBE2AB5FC6B9 foreign key (id) references person (id);



hibernate中的几种映射_第1张图片




你可能感兴趣的:(Hibernate,mapping)