woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

hibernate多表关联总结

1>:one-to-one(一对一关联)主键关联:

一对一关联一般可分为主键关联和外键关联

主键关联的意思是说关联的两个实体共享一个主键值,但这个主键可以由两个表产生.

现在的问题是:

*如何让另一个表引用已经生成的主键值

解决办法:

*Hibernate映射文件中使用主键的foreign生成机制

eg:学生表:

<hibernate-mapping>

 <class table="user" catalog="study">

 <id type="java.lang.Integer">

 <column />

 <generator />

 </id>

 <property type="java.lang.String">

 <column length="20" />

</property>

<one-to-one cascade="all"></one-to-one>

</class>

</hibernate-mapping>

添加:<one-to-one

 

fetch="join"

cascade="all" />

<class>元素的lazy属性为true,表示延迟加载,如果lazy设为false,则表示立即加载.以下对这二点进行说明.

立即加载:表示在从数据库中取得数据组装好一个对象后,会立即再从数据库取得数据组装此对象所关联的对象

延迟加载:表示在从数据库中取得数据组装好一个对象后,不会立即从数据库中取得数据组装此对象所关联的对象,

而是等到需要时,才会从数据库取得数据组装此关联对象.

<one-to-one>元素的fetch属性可选为selectjoin

join:连接抓取,Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合.

select:查询抓取,Hibernate需要另外发送一条select语句抓取当前对象的关联实体或集合.

******所以我们一般用连接抓取<join>

证件表:

<hibernate-mapping>

<class table="card" lazy="true" catalog="study">

<id type="java.lang.Integer">

<column />

<generator >

<param >user</param>

</generator>

</id>

<!-- id使用外键(foreign)生成机制,引用代号为user的对象

的主键作为card表的主键和外键。同时user在下面的

<one-to-one>中进行了定义 -->

<property type="java.lang.Integer">

<column />

</property>

<one-to-one constrained="true"></one-to-one>

<!-- constrained="true"表示card引用了student的主键作为外键。 -->

</class>

</hibernate-mapping>

一对一映射必须加载的元素有:

name

class

constrained(主键关联)

fetch(关联的一方才有:意思是说需要通过这一方查询另一方数据的一方.比如学生表查询证件中的数据,学生就是关联的一方)

cascade(关联的一方才有:意思是说需要通过这一方保存或者更新数据对另一方也产生影响(另一方也保存或者更新了,比如保存学生信息,那么与学生相关联的证件信息也保存了))

 

2><one-to-one>外键关联:

开发中可以参照<one-to-one>主键关联和<many-to-one>

这里,学生表保存不变,只改变证件表:

<hibernate-mapping>

<class table="card" lazy="true">

<id type="java.lang.Integer">

<column />

<generator /><!-- 不再是foreign,因为它的主键不是学生表的主键,它的主键是自动产生的,它的外键才是学生表的主键 -->

</id>

<property type="java.lang.String">

<column length="20" />

</property>

<many-to-one column="userid" unique="true"/>

<!-- 惟一的多对一,如果被限制为唯一,实际上变成一对一关系了 -->

<!-- unique设为true表示使用DDL为外键字段生成一个惟一约束。

以外键关联对象的一对一关系,其本质上已经变成了一对多的双向关联,

应直接按照一对多和多对一的要求编写它们的映射文件。当unique

true时实际上变成了一对一的关系。

***这里需要强调一点的是<many-to-one>元素必须有column这一项,它表示这个这个表的外键是什么.注意,这里是表的外键,不是类的外键-->

</class>

</hibernate-mapping>

 

3>:<one-to-many>单身关联

一对多关联分为单向一对多关联和双向一双多关联

单向的一对多关联只需要在一方进行映射配置

单身一对多关联:

<hibernate-mapping>

<class table="customers" catalog="study">

<id type="java.lang.Long">

<column />

<generator />

</id>

<property type="java.lang.String">

<column length="20" />

</property>

<set table="orders" cascade="save-update" inverse="true">

<key column="customers_ID"></key>

<one-to-many />

</set>

</class>

</hibernate-mapping>

这里需要强调的是<set>元素的属性代表的意义:

name

table

lazy:当为true时为延迟加载,false时为立即加载

inverse:用于表示双向关联中的被动一端,inverse的值为false的一方负责维护关联关系

cascade

sort:排序关系,unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了java.util.comparator接口的类型  指定排序算法。);

******<key>子元素的column属性指定关联表(orders)的外键(customers_ID)

4>:<one-to-many>双向关联:

如果要设置一对多双向关联关系.那么还需要在""的映射文件中使用<many-to-one>

<many-to-one

 

column="customers_ID"

cascade="none"

outer-join="auto"

insert="false" insertupdate设定是否对column属性指定的关联字段进行insertupdate操作

update="false">

</many-to-one>

 

 

4>多对多关联:

多对多关联时要建一个连接表查询

学生的映射文件

<hibernate-mapping>

<class table="students" catalog="study">

<id type="java.lang.Long">

<column />

<generator />

</id>

<property type="java.lang.String">

<column length="20" />

</property>

<set table="student_teacher_table" cascade="save-update" inverse="false">

<key column="stuID"></key>

<many-to-many column="teaID"></many-to-many>

</set>

***<key>元素的理解:

它的控制主要是通过stuID(外键)来完成,就是我们从student_teacher_table表中我们只要

select * from student_teacher_table where stuID='该学生的ID',这样我们就可以得到它的教师的ID

***<many-to-many>的理解:

我们从student_teacher_table表中根据stuID拿到了与该stuID关联的teaID,

然后select * from teacher where teaID='前一步拿到的teaID'

</class>

</hibernate-mapping>

 

教师的映射文件

<hibernate-mapping>

<class table="teachers" catalog="study">

<id type="java.lang.Long">

<column />

<generator />

</id>

<property type="java.lang.String">

<column length="20" />

</property>

<set table="student_teacher_table" inverse="true">

<key column="teaID"></key>

<many-to-many column="stuID"></many-to-many>

</set>

</class>

</hibernate-mapping>

 

posted on 2009-08-05 13:24 肥仔 阅读(1262) 评论(0)  编辑 收藏 引用 所属分类: Web-后台


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理