Hibernate(three)
//////////2016-12-16 ~ 2016-12-17///////////
int study_data(){
Hibernate关系映射
一对一关系:
应用场景: 数据脱敏
共享主键
关系定义(主控方):
xml:
<one-to-one name="propertyName" class="className" cascade="all" />
annotation:
@OneToOne
@PrimaryKeyJoinColumn
关系定义(被控方):
xml:
<one-to-one name="propertyName" class="className" />
annotation:
@OneToOne(mappedBy="propertyName")
一对多关系:
应用场景:
定义外键连接
关系定义(一方):
xml:
<set name="propertyName" cascade="all" inverse="true">
<key column="foreign_key_col"/>
<one-to-many class="className"/>
</set>
annotation:
@OneToMany
@JoinColumn(name="foreignKeyName")
关系定义(多方):
xml:
<many-to-one name="propertyName" column="columnName" class="className"/>
annotation:
@ManyToOne()
@JoinColumn(name="foreignKeyName")
多对多关系:
应用场景:
不建议使用,建议拆解成2个一对多的连接
关系定义(主控方):
xml:
<set name="propertyName" table="middle_table_name">
<key column="columnName_master" />
<many-to-many class="className" column="columnName_slave" />
</set>
annotation:
@ManyToMany
@JoinTable(name="middle_table_name"),
joinColumns=@JoinColumn(name="columnName_master"),
inverseJoinColumns=@JoinColumn(name="columnName_slave")
关系定义(被控方):
xml:
<set name="propertyName" table="middle_table_name">
<key column="columnName_slave" />
<many-to-many class="className" column="columnName_master" />
</set>
annotation:
@ManyToMany(mappedBy="propertyName")
延迟加载(lazy load)
为了减少由于大量关联信息引起的查询性能负担
对于集合属性,通常采用延迟加载策略
lazy="true/false"
FetchType.EAGER(迫切加载)/FetchType.LAZY(延迟加载)
级联设置(cascade)
all - 所有操作都执行级联操作
none - 所有操作都不执行级联操作
save-update - 仅保存和更新时执行级联操作
delete - 仅删除时执行级联操作
控制设置(inverse)
是否将维护关系的权利交给对方
默认值为false,可选为true
一对多关系中,通常讲"一"的一方设为true,即由"多"的一方来维护关系
Java Annotation中由mappedBy属性替代
抓取策略(fetch)
抓取策略:当应用需要通过关联关系获得引用对象时,如何获得对象信息的策略
join - 通过连接的方式获得引用对象信息,默认延迟加载为false
select - 通过产生select查询的方式获得引用对象信息,默认延迟加载为true
subselect(只允许查找多方"-tomany") - 通过子查询获得关联对象的信息,默认延迟加载为true
batch(Annotation中已取消使用) - 通过给定的值,批量查找关联对象的信息,默认延迟加载为true。
例如:batch-size="5",则对于10个关联对象,会查询2次
}