1.关联关系:类与类之间最普遍的关系
1.1Hibernate关联映射
1.1.1Many2One
配置:
<!--配置多对一单向关联
name:一的一方在多的一方的属性名
cloumn:在t_emp表中生成的列名(外键列)
-->
<many-to-one name="dept" column="dept_id"/>
---实际使用中:一定要先添加一的一方再添加多的一方
2.One2Many
<!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
-->
<set name="comments">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
---实际应用中,尽量不要使用一的一方去维护关系
--会多发sql
--代码不方便维护
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
cascade属性值:
none:当session操纵当前对象时,忽略其他关联的对象,它是cascade属性的默认值
save-update:当通过Session的save(),update()及saveOrUpdate()方法来保存或更新当前对象时,级联宝尊
所有关联的新建的瞬时状态的对象,并且更新所有关联的游离状态的对象
delete:当通过Session的delete()方法删除当前对象时,会级联删除所有的对象
inverse属性:
inverse属性指定了关联关系中的方向
inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false
inverse设置为true,不负责维护关联关系
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
①在建立两个对象的双向关联时,应该同时修改两个关联对象的相关属性
②建议inverse设置为true
尽量让多的一方来维护关系
3.order-by属性用于在数据库中集合排序
order-by:获取多的一方时进行排序
eg: <!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
order-by:获取多的一方时进行排序
-->
<set name="comments" cascade="all" inverse="true" order-by="content asc">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
4.延迟加载(lazy load懒加载):
是当真正需要数据时,才执行sql语句进行查询。避免了无畏的开销
①类级别的查询策略
lazy属性值:
true---延迟加载
false---立即加载
②一对多和多对多关联的查询策略
true---延迟加载
false---立即加载
extra---加强延迟加载
③多对一关联的查询策略
eg:
<!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
order-by:获取多的一方时进行排序
lazy:extra(会智能一些,根据用户最终使用的需求来确定发送怎样的sql)
-->
<set name="comments" cascade="all" inverse="true" order-by="content asc" lazy="extra">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
5.Open Session In View:
在用户的每一次请求过程中始终保持一个Session对象打开着
ThreadLocal:线程变量
OpenSessionInView:
--使用过滤器,在请求前开启session,开启事务
--在请求后提交或者回滚事务,在关闭session
6.Many2Many
--admin.hbm.xml
<!--配置多对多关系映射-->
<set name="roles" table="t_admin_role">
<key column="admin_id"/>
<many-to-many class="Role" column="role_id"/>
</set>
--role.hbm.xml
<!--配置多对多关系映射-->
<set name="admins" table="t_admin_role">
<key column="role_id"/>
<many-to-many class="Admin" column="admin_id"/>
</set>
相关异常:
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
--出现这种异常时,将原有的表删除然后在运行程序。
IDEA快捷键:
Ctrl+D:复制当前行(光标定位到当前行)
Ctrl+X:删除当前行
Shift+Alt+↑:移动当前行至上一行
Shift+Alt+↓:移动当前行至下一行
1.1Hibernate关联映射
1.1.1Many2One
配置:
<!--配置多对一单向关联
name:一的一方在多的一方的属性名
cloumn:在t_emp表中生成的列名(外键列)
-->
<many-to-one name="dept" column="dept_id"/>
---实际使用中:一定要先添加一的一方再添加多的一方
2.One2Many
<!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
-->
<set name="comments">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
---实际应用中,尽量不要使用一的一方去维护关系
--会多发sql
--代码不方便维护
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
cascade属性值:
none:当session操纵当前对象时,忽略其他关联的对象,它是cascade属性的默认值
save-update:当通过Session的save(),update()及saveOrUpdate()方法来保存或更新当前对象时,级联宝尊
所有关联的新建的瞬时状态的对象,并且更新所有关联的游离状态的对象
delete:当通过Session的delete()方法删除当前对象时,会级联删除所有的对象
inverse属性:
inverse属性指定了关联关系中的方向
inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false
inverse设置为true,不负责维护关联关系
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
①在建立两个对象的双向关联时,应该同时修改两个关联对象的相关属性
②建议inverse设置为true
尽量让多的一方来维护关系
3.order-by属性用于在数据库中集合排序
order-by:获取多的一方时进行排序
eg: <!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
order-by:获取多的一方时进行排序
-->
<set name="comments" cascade="all" inverse="true" order-by="content asc">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
4.延迟加载(lazy load懒加载):
是当真正需要数据时,才执行sql语句进行查询。避免了无畏的开销
①类级别的查询策略
lazy属性值:
true---延迟加载
false---立即加载
②一对多和多对多关联的查询策略
true---延迟加载
false---立即加载
extra---加强延迟加载
③多对一关联的查询策略
eg:
<!--配置一对多关联映射
name:多的一方在一的一方中的属性名称
cascade:级联操作
(在未操作时,不会删除数据,只是会将外键置空
设置之后,会将有外键关联的数据删除掉)
inverse:当设置为true时表示将关系交由对方(多的一方)来维护
order-by:获取多的一方时进行排序
lazy:extra(会智能一些,根据用户最终使用的需求来确定发送怎样的sql)
-->
<set name="comments" cascade="all" inverse="true" order-by="content asc" lazy="extra">
<!--自己(一的一方)在对方(多的一方)中的列名-->
<key column="msg_id"/>
<!--指定多的一方的类-->
<one-to-many class="Comment"/>
</set>
5.Open Session In View:
在用户的每一次请求过程中始终保持一个Session对象打开着
ThreadLocal:线程变量
OpenSessionInView:
--使用过滤器,在请求前开启session,开启事务
--在请求后提交或者回滚事务,在关闭session
6.Many2Many
--admin.hbm.xml
<!--配置多对多关系映射-->
<set name="roles" table="t_admin_role">
<key column="admin_id"/>
<many-to-many class="Role" column="role_id"/>
</set>
--role.hbm.xml
<!--配置多对多关系映射-->
<set name="admins" table="t_admin_role">
<key column="role_id"/>
<many-to-many class="Admin" column="admin_id"/>
</set>
相关异常:
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
--出现这种异常时,将原有的表删除然后在运行程序。
IDEA快捷键:
Ctrl+D:复制当前行(光标定位到当前行)
Ctrl+X:删除当前行
Shift+Alt+↑:移动当前行至上一行
Shift+Alt+↓:移动当前行至下一行