onions 2007-4-4 10:54
mapping文件中的标记详解:关系标记
2.另一类常见的标记是建立表与表之间的关系。这类标记暂叫“关系标记” u-K \3~l\hA7B _d]]
7X5WI \3q!]~ jL(G
x'_5}i-xeO
2.0 “关系标记”有: one-to-one, many-to-one, set+one-to-many, set+many-to-many
0n"w6VaUt _|2M
Tiwt|F;_
Gw5l.Ah;y%Fi
2.1 [color=blue]hibernate mapping中建立的表与表之间的关系和数据库中表与表之间的关系无任何瓜葛,互无影响。[/color] *G&qv"K~&[X^
前者暂叫“cfg表关系”或“config 表关系”, 或者叫“db表关系”或“database 表关系” tA1C/^_
不过,cfg表关系常常参照db表关系来建立。 !Y)d,f.Y5o4t@
&nZW
\Y"C$?
%_*{p1V5\rk+e9y
2.2 一个关系标记对应一个属性,但该属性表达“表与表的关系”,而不与字段对应。这类属性暂叫“关系属性”
#p;GZL3a@ t X
(1)这就表示更新本表的字段时,不考虑这些关系属性;
,^%l]mQD{
(2)更新本表的同时,也可能要同时更新关系表,这时关系属性起作用。 `Jf-l0g&lw
(}5z*~ilqv
1W/B6B.z'a-@
2.3 准则:"cfg表关系"没有相互性。
~]r DN(?X2rF0T
表mainTable 和 表relationTable, &F5i"u"YS
在mainTable的mapping文件中建立与relationTable的many-to-one的"cfg表关系" 。 q
r5YY,qW1r(]I
这不表示relationTable与mainTable有one-to-many的"cfg表关系"
+}.c&[svh-q7s;m
对relationTable的pojo对象进行数据库操作完全不受这个"cfg表关系"影响,就像没有这个关系一样。 j-D1@k4_9cp
C
对mainTable的pojo对象进行数据库操作,可能会根据这个"cfg表关系"更新mainTable表和relationTable表 9A(NW%K7ZM
\"Y6aI4Jo
7u0[:~2ncp}Y
这点与"db表关系"不同,比如在mainTable中建立了一个指向relationTable的foreign key, LKSVg8z
那么往mainTable中插入一个foreign key 不存在的记录是不容许的,
g9r{+]_)W t
从 relationTable中删除一条记录,而这条记录mainTable中有记录关联它,那么删除会 导 致 异常。 5p&}@0k,O}l:u
/V;A&EFn
2T9o8h
` @X;p lO/x
这条准则很重要。
9uX3F{(E(s/zI
qzk'c
这表示一个mapping文件中建立的"cfg表关系"不会影响其它mapping文件中的"cfg表关系", r-VqYi*MF.mL
,反过来,它也不受其它mapping文件中的"cfg表关系"的影响。
y&O@!c
a7I0f'M
这意味着一条"cfg表关系的"的作用是可预见的,其作用由它所在的mapping文件确定的。 Ia8c7gMd!iP
^5v|j5x'| m
f+e@+ZX$H$u d:V
如果relationTable想与mainTable有one-to-many的"cfg表关系",则需在relationTable的mapping文件中
"PP6r Tt#qg
用oneToMany标记显示地建立这种关系。 4x1X}1AmSY{J
7u:@:X%|F;f:?
-E;x:Ma-[_F
extend: 属性inverse=true的"cfg表关系"叫"bidirectional association"(双向关系),这个属性并不会破坏这条准则。
ol+?Z7V*U'vjROE
后面会详细 讨 论 inverse属性。
-] KM{T f&S
k6V;yN3i
hY/k8o1E2Kr)x6R1X
F0uH*RB
`[:mmDa
G![!C9lyG!G
2.4 "cfg表关系"( mainTable -- relationTable )有 以 下 几 种情况: G@ {xH#TN[k
(1)one-to-one
5B:yrm@Pu
表mainTable的主键对应relationTable的主键,
0v
e*EB5o"`GZ
多个字段作主键时,按照在mapping文件中字段出现的顺序一一对应(如果字段数不同 会 exception) E pg_2N*?]
$r
?P7y7I+S2u T
3[.d%gr
y4I)[u
eg:配置Teacher表的mapping文件:[code]<one-to-one name="wife"class="db.Teacher"/> (这个配置的意思是"老师的老婆是一个老师") [/code](2)many-to-one
Fr7O8~n5l*@v6~
这个标记既属于“映射标记”又是“关系标记”。它有update和insert属性即是 明 证。 3_$I,C
Us s XL
lFt6o M1t(~U
0w*kL
}u#Ne7x
表mainTable的一些字段对应relationTable的主键 9p
}HV5x+UL n!KB
在many-to-one标记中要声明哪些字段对应relationTable的主键 }f
RGbs)}
(]MV+s3@4b2w
u.Y1L
W#MTY]7R n/h/Q(V.X
eg:配置schoole表的mapping文件:[code]<many-to-one name="address" class="db.Address">