关联关系总结:
如何考虑hibernate处理对象之间的关联关系的底层细节时,可以从两方面进行思考
(1)如何将对象之间的关联关系保存到数据库中
(2)如何检索出关联的对象(主语句要看sql)
(映射文件id缺省的情况下)
一对一:1条sql
多对一或是一对多:2条sql
多对多:3条sql
对象集合使用类的一部分
单个属性,来取代一对多(比如只要员工类的名字)
一、set特性:没有顺序,不允许元素重复
表结构:
SQL> desc department;
Name Type Nullable Default Comments
---- ------------- -------- ------- --------
ID NUMBER(10)
NAME VARCHAR2(255)
SQL> desc employee;
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
ID NUMBER(10)
NAME VARCHAR2(255)
DEPART_ID NUMBER(10)
映射文件:
<set name="emps" >
<key column="depart_id"></key><!-- 告诉hibernate按照什么字段检索employee表数据,必须和employee.hbm.xnml中的外键定义一样-->
<one-to-many class="Employee"></one-to-many> <!--告诉hibernate集合set中装什么类型 -->
</set>
二、list特性:有顺序的,可以元素重复,但是索引不可重复
在employee表中会由hibernate根据Department.hbm.xml一对多的映射关系添加一字段,用于记录是加入的第几个员工
table employee结构
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
ID NUMBER(10)
NAME VARCHAR2(255)
DEPART_ID NUMBER(10)
ORDER_COL NUMBER(10) Y
映射文件:
<list name="emps">
<key column="depart_id"/>
<list-index column="order_col"/>因为List是有顺序的,hibernate通过这个标签记录员工是第几个加进来的
<one-to-many class="Employee" />
</list>
list总结:对于有些时候我们是不需要保存list的加入顺序,因为也会消耗不少的内存资源。
此时不需保存顺序时,可以在映射文件使用bag标签,jdk没有特别与之对应的集合,但是使用了bag标签,domain则必须是list相对应才可使用
三、bag标签必须与list接口对相应
与list的标签时的表结构相比,少了list-index的这一列。从而减少了内存开销
employee 表结构
Name Type Nullable Default Comments
--------- ------------- -------- ------- --------
ID NUMBER(10)
NAME VARCHAR2(255)
DEPART_ID NUMBER(10)
映射文件:
<bag name="emps">
<key column="depart_id"/>
<one-to-