IDEA + SSH OA 第一天(项目收获:Hibernate XML)
之前都是用工具逆向生成代码,很少写配置文件,今天试着使用,有几点需要注意
Cascade(级联):
Cascade代表是否执行级联操作,Inverse代表是否由己方维护关系。
Cascade属性的可能值有:
all: 所有情况下均进行关联操作,即save-update和delete。
none: 所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete: 在执行delete 时进行关联操作。
all-delete-orphan: 当一个节点在对象图中成为孤儿节点时,删除该节点。比如在一个一对多的关系中,Student包含多个book,当在对象关系中删除一个book时,此book即成为孤儿节点。
inverse(控制方向反转):
一对多:该属性在多的一方。应该在一方的设置 inverse=true ,多的一方设置 inverse=false(多的一方也可以不设置inverse属性,因为默认值是false),这说明关联关系由多的一方来维护。原因:该关联关系的属性在多的一方的表中,在维护关联关系的时候在多的一方容易维护。
多对多:属性在独立表中。在任意一方设置inverse=true,另一方inverse=false;原因:如果两个多设置为true 的话,表示两方都对关联关系表(独立表)进行了同样的维护,其实只要一方维护就行了,效率上来说,这样设置是合理点的。
一对一:其实是一对多的一个特例,inverse 的设置也是一样的,主要还是看关联关系的属性在哪一方,这一方的inverse=false。
多对一:也就是一对多的反过来,没什么区别。
模板:
如在同包中 class 可以不写全限定名。(<hibernate-mapping package="包名">)
多对一:column 推荐填写 属性名+Id 如 userId
一对多:key column 拷贝 多对一 的column
多对多:key column 本对象名+Id,class 推荐填写 关联对象名 + Id
多对一:
<many-to-one name="属性名" class="对方的类名" column="..."></many-to-one>
在表中:column 内所装的内容,只可能是 class 中对方表的 Id 值,并且在表中会创建 column 列;
一对多:
<set name="属性名">
<key column=" 多对一 的column "></key>
<one-to-many class="关联对象名+Id"/>
</set>
name 为类中所使用的字段,表中不会创建列,
之前在纠结,为什么 key column 需要填写,
多对一 是为了让子表的 column 字段添加内容时,查找添加内容是否是主表的 Id 之一,也就是确认添加内容是否合法。
而 一对多 的 key column 是为了在使用中添加内容时,自动在子表 column 加入当前类的 主键。
多对多(肯定会有一张中间表):
<set name="属性名" table="中间表名">
<key column="本对象名+Id"></key>
<many-to-many class="关联对象名+Id" column="在表中对应的列名"></many-to-many>
</set>
中间表名推荐使用 两表结合名 如:user_department ;