1、添加索引:
在一對多的關系中,在多的一方會產生一個外鍵,這個外鍵沒有自動 添加索引,當存在從一的一端產生對多的一端的查詢時,有可能會在多的一端造成全表查詢問題,數據量巨大時會產生嚴重的性能問題。可以在多一端的外鍵上添加 索引(index="user_group_id_idx")來解決這個問題。例如:

<?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="com.bjsxt.hibernate.User" table="t_user"> <id name="id"> <generator class="sequence"> <param name="sequence">user_id_seq</param> </generator> </id> <property name="name"></property> <many-to-one name="group" column="group_id" index="user_group_id_idx"></many-to-one> </class> </hibernate-mapping>
發出的SQL語句為:

create index user_group_id_idx on t_user (group_id)
2、添加約束:
id會產生主鍵約束,同時會建立索引;key會產生外鍵,但默認不會建立索引;在class或set上通過使用check關鍵字來產生 check約束(例如:<set name="emailAddresses" table="t_email" check="email_address like '%@%'">);單個字段的唯一鍵通過(unique="true")設置,多個字段聯合唯一通過在需要聯合的字段上添加(unique- key="name")來實現,其中對聯合唯一索引的unique-key的值必須相同;通過not-null="true"來設置字段的非空約束。

<?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="events.Person" table="t_person"> <id name="id" column="person_id"> <generator class="sequence"> <param name="sequence">person_id_seq</param> </generator> </id> <property name="age"></property> <property name="firstName" unique-key="name"></property> <property name="lastName" unique-key="name"></property> <set name="emailAddresses" table="t_email" check="email_address like '%@%'"> <key column="person_id"></key> <element column="email_address" type="string"></element> </set> <set name="events" table="t_person_event"> <key column="person_id"></key> <many-to-many class="events.Event" column="event_id"></many-to-many> </set> </class> </hibernate-mapping>
產生的SQL語句是:

drop table t_email cascade constraints drop table t_event cascade constraints drop table t_person cascade constraints drop table t_person_event cascade constraints drop sequence event_id_seq drop sequence person_id_seq create table t_email ( person_id number(19,0) not null, email_address varchar2(255 char), check (email_address like '%@%') ) create table t_event ( event_id number(19,0) not null, title varchar2(255 char), event_date date, primary key (event_id) ) create table t_person ( person_id number(19,0) not null, age number(10,0), firstName varchar2(255 char), lastName varchar2(255 char), primary key (person_id), unique (firstName, lastName) ) create table t_person_event ( event_id number(19,0) not null, person_id number(19,0) not null, primary key (person_id, event_id) ) alter table t_email add constraint FKA03188117708282F foreign key (person_id) references t_person alter table t_person_event add constraint FKC7F6A31B7708282F foreign key (person_id) references t_person alter table t_person_event add constraint FKC7F6A31BF96D1A45 foreign key (event_id) references t_event create sequence event_id_seq create sequence person_id_seq