数据库的表关系图
1>:one-to-one(一对一关联)主键关联:
一对一关联一般可分为主键关联和外键关联
主键关联的意思是说关联的两个实体共享一个主键值,但这个主键可以由两个表产生.
现在的问题是:
*如何让另一个表引用已经生成的主键值
解决办法:
*Hibernate映射文件中使用主键的foreign生成机制
eg:学生表:
<hibernate-mapping>
<class name="org.wen.beans.Ur" table="ur" catalog="study">
<id name="urid" type="java.lang.Integer">
<column name="urid" />
<generator class="native" />
</id>
<property name="urname" type="java.lang.String">
<column name="urname" length="20" />
</property>
<one-to-one name="card" class="org.wen.beans.Card" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
添加:<one-to-one name="card"
class="org.wen.beans.Card"
考拉的英文 fetch="join"
cascade="all" />
<class>元素的lazy属性为true,表示延迟加载,如果lazy设为fal,则表示立即加载.以下对这二点进行说明.
立即加载:表示在从数据库中取得数据组装好一个对象后,会立即再从数据库取得数据组装此对象所关联的对象
延迟加载:表示在从数据库中取得数据组装好一个对象后,不会立即从数据库中取得数据组装此对象所关联的对象,
而是等到需要时,才会从数据库取得数据组装此关联对象.
<one-to-one>元素的fetch属性可选为lect和join
join:连接抓取,Hibernate通过在Select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合.
lect:查询抓取,Hibernate需要另外发送一条lect语句抓取当前对象的关联实体或集合.
******所以我们一般用连接抓取<join>
证件表:
<hibernate-mapping>
<class name="org.wen.beans.Card" table="card" lazy="true" catalog="study">
<id name="cardid" type="java.lang.Integer">
<column name="cardid" />
<generator class="foreign">
<param name="property">ur</param>
</generator>
新闻编辑室第二季 </id>
<!-- id使用外键(foreign)生成机制,引用代号为ur的对象
的主键作为card表的主键和外键。同时ur在下面的
<one-to-one>中进行了定义 -->
<property name="cardnum" type="java.lang.Integer">
<column name="cardnum" />
</property>
<one-to-one name="ur" class="org.wen.beans.Ur" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
一对一映射必须加载的元素有:
name
pb是什么元素
class
constrained(主键关联)
fetch(关联的一方才有:意思是说需要通过这一方查询另一方数据的一方.比如学生表查询证件中的数据,学生就是关联的一方)
cascade(关联的一方才有:意思是说需要通过这一方保存或者更新数据对另一方也产生影响(另一方也保存或者更新了,比如保存学生信息,那么与学生相关联的证件信息也保存了))
2><one-to-one>外键关联:
开发中可以参照<one-to-one>主键关联和<many-to-one>
这里,学生表保存不变,只改变证件表:
<hibernate-mapping>
<class name="org.wen.beans.Card" table="card" lazy="true">
<id name="cardid" type="java.lang.Integer">
<column name="cardid"/>
<generator class="increment"/>
</id>
<property name="cardnum" type="java.lang.String">
<column name="cardnum" length="20" />
</property>
<many-to-one name="ur" column="urid" class="org.wen.beans.ur" unique="true"/>
<!-- unique设为true表示使用DDL为外键字段生成一个惟一约束。
以外键关联对象的一对一关系,其本质上已经变成了一对多的双向关联,
应直接按照一对多和多对一的要求编写它们的映射文件。当unique为
true时实际上变成了一对一的关系。
***这里需要强调一点的是<many-to-one>元素必须有column这一项,它表示这个这个表的外键是什么.注意,这里是表的外键,不是类的外键-->
</class>
</hibernate-mapping>
contain>interface
信徒的意思3>:<one-to-many>单身关联
一对多关联分为单向一对多关联和双向一双多关联
单向的一对多关联只需要在一方进行映射配置
单身一对多关联:
<hibernate-mapping>
<class name="org.wen.beans.Customers" table="customers" catalog="study">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="native" />
</id>
<property name="urName" type="java.lang.String">
bluff <column name="urName" length="20" />烘炉
</property>
<t name="orders" table="orders" cascade="save-update" inver="true">
<key column="customers_ID"></key>
<one-to-many class="org.wen.beans.Orders"/>
</t>
</class>
</hibernate-mapping>
这里需要强调的是<t>元素的属性代表的意义:
name
table
商务英语考试 lazy:当为true时为延迟加载,为fal时为立即加载
inver:用于表示双向关联中的被动一端,inver的值为fal的一方负责维护关联关系
cascade
sort:排序关系,unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了parator接口的类型 指定排序算法。);
******<key>子元素的column属性指定关联表(orders表)的外键(customers_ID)
nbst
4>:<one-to-many>双向关联:
如果要设置一对多双向关联关系.那么还需要在"多"的映射文件中使用<many-to-one>
<many-to-one name="customer"