在数据库中 ,可以通过sql语句来设置外键约束
constraint 外键名 foreign key 外键的id references 外键的表(对应的属性),例如 CONSTRAINTworktime_employee_fk FOREIGN KEY(e_id) REFERENCES employee(id)
在hibernate中可以通过在各自的实体类.hbm.xml中设置
一、一对多的关系和多对一的关系
<?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 package="hibernate_b_example">
<class name="Dept" table="depts">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- employees属性,表示本类与Employee的一对多的关系 -->
<set name="employees" cascade="all">
<key column="deptid"></key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
<?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 package="hibernate_b_example">
<class name="Employee" table="employee">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- dept属性,表示本类与Dept的多对一的关系 -->
<many-to-one name="dept" class="Dept" column="deptid" />
</class>
</hibernate-mapping>
在一对多和多对一的关系中,在多的那方设置外键,在一的那方拿到多的那方的外键,即可在数据库中进行创建了。
二、多对多的关系
<?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 package="hibernate_c_example">
<class name="Student" table="student">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- teachers属性,表示和Teacher的多对多关系 -->
<set name="teachers" table="teacher_student">
<key column="studentId"></key>
<many-to-many class="Teacher" column="teacherId" />
</set>
</class>
</hibernate-mapping>
<?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 package="hibernate_c_example">
<class name="Teacher" table="teacher">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- students属性,表示和Student类的多对多关系 -->
<set name="students" table="teacher_student">
<key column="teacherId"></key>
<many-to-many class="Student" column="studentId" />
</set>
</class>
</hibernate-mapping>
在多对多的关系中,需要建立的是三个表,两个实体类的表和一个联系表,在联系表中通过各自的主键和外键进行联系
三、一对一的关系
<?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 package="hibernate_a_example">
<class name="Person" table="person">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- idCard属性,IdCard类型。
表达的是本类与IdCard的一对一。
采用基于外键的一对一映射方式,本方无外键方。
property-ref属性:
写的是对方映射中外键列对应的属性名。
-->
<one-to-one name="idCard" class="IdCard" property-ref="person"/>
</class>
</hibernate-mapping>
<?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 package="hibernate_a_example">
<class name="IdCard" table="idcard">
<id name="id">
<generator class="native" />
</id>
<property name="number" />
<!-- person属性,Person类型。
表达的是本类与Person的一对一。
采用基于外键的一对一映射方式,本方有外键方。 -->
<many-to-one name="person" class="Person" column="personId" unique="true"></many-to-one>
</class>
</hibernate-mapping>
对于一对一 的关系中,还有一种方式是两个实体都不需要外键的形式,通过主键的各自对应,主键即是外键来设置
<?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 package="hibernate_b_example">
<class name="Person" table="person01">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<!-- idCard属性,IdCard类型。
表达的是本类与IdCard的一对一。
采用基于主键的一对一映射方式,本方无外键方。
-->
<one-to-one name="idCard" class="IdCard"></one-to-one>
</class>
</hibernate-mapping>
<?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 package="hibernate_b_example">
<class name="IdCard" table="idcard01">
<id name="id">
<!-- 当使用基于主键的一对一映射时,
有外键方的主键生成策略一定要是foreign。
参数property:
生成主键值时所根据的对象。
-->
<generator class="foreign" >
<param name="property">person</param>
</generator>
</id>
<property name="number" />
<!-- person属性,Person类型。
表达的是本类与Person的一对一。
采用基于主键的一对一映射方式,本方有外键方。 -->
<one-to-one name="person" class="Person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
关于一对一的关系一共有两种方式,不同建议是使用拥有外键的方式比较好,如果通过主键即是外键这种方式,主键不能为空和0,所以有限制。
上面的实例是在对对象的对应关系,下面是对字符的对应关系
<?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 package="hibernate_a_example">
<class name="User" table="users">
<id name="id">
<generator class="native" />
</id>
<property name="name" />
<set name="addressSet" order-by="address desc" table="user_address">
<key column="userid"></key>
<element type="string" column="address"></element>
</set>
<list name="addressList" table="user_addressList">
<key column="userId"></key>
<list-index column="idx"></list-index>
<element type="string" column="address"></element>
</list>
<map name="addressMap" table="user_addressMap">
<key column="userId"></key>
<map-key type="string" column="key_"></map-key>
<element column="address" type="string"></element>
</map>
</class>
</hibernate-mapping>