- hibernate完成一对多关联映射:
一对多的建表原则:在多的一方创建外键指向一的一方的主键
多对多建表原则:创建一个中间表,中间表至少有两个字段分别作为外键指向多对多双方的主键
一对一的建表原则:一方的主键作为另一方的主键
hibernate是一个ORM的框架:在关系型数据库中描述表与表之间的关系,使用的是外键,开发语言是Java,面向对象的。
一的一方映射的创建:
<!-- 配置一对多的映射:放置的多的一方的集合 -->
<!--
set标签 :
* name :多的一方的对象集合的属性名称。
* cascade:级联
* inverse:放弃外键维护权。
-->
<set name="linkMans" cascade="save-update" inverse="true">
<!--
key标签
* column:多的一方的外键的名称。
-->
<key column="lkm_cust_id"/>
<!--
one-to-many标签
* class :多的一方的类的全路径
-->
<one-to-many class="com.itheima.hibernate.domain.LinkMan"/>
</set>
多的一方映射的创建:
<!-- 配置多对一的关系:放置的是一的一方的对象 -->
<!--
many-to-one标签
* name :一的一方的对象的属性名称。
* class :一的一方的类的全路径。
* column :在多的一方的表的外键的名称。
-->
<many-to-one name="customer" class="com.itheima.hibernate.domain.Customer" column="lkm_cust_id"/>
-
一对多关系保存一边是否可以:
不可以,报一个瞬时对象异常:持久态对象关联了一个瞬时态对象 -
一对多的级联操作:
级联:操作一个对象时,是否会同时操作其关联的对象。 -
级联保存或更新:
关键字cascade
cascade="save-updage"
-
级联删除:
删除一边的时候,同时另一方的数据也一并删除,关键字 cascade=“delete” -
一对多设置了双向关联产生多余SQL语句的处理方法:
使一方放弃外键维护权:一的一方放弃,在set上配置inverse=“true” -
hibernate的多对多关系配置:
双方都放置集合
多对多关系映射:
<!-- 与用户的多对多的映射关系 -->
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="users" table="sys_user_role" cascade="save-update,delete" inverse="true">
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="role_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.itheima.hibernate.domain.User" column="user_id"/>
</set>```
<!--
set标签
* name :对方的集合的属性名称。
* table :多对多的关系需要使用中间表,放的是中间表的名称。
-->
<set name="roles" table="sys_user_role" cascade="save-update,delete" >
<!--
key标签:
* column :当前的对象对应中间表的外键的名称。
-->
<key column="user_id"/>
<!--
many-to-many标签:
* class :对方的类的全路径
* column :对方的对象在中间表中的外键的名称。
-->
<many-to-many class="com.itheima.hibernate.domain.Role" column="role_id"/>
</set>```
- 多对多建立的双向关系必须有一方放弃外键的维护,一般是被动方放弃外键的维护权。
- hibernate的多对多操作不可以保存一边
- 多对多的级联操作同一对多的级联操作
- 给用户改选角色:
先remove再add
public void demo8(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
// 查询2号联系人
LinkMan linkMan = session.get(LinkMan.class, 2l);
// 查询2号客户
Customer customer = session.get(Customer.class, 2l);
// 双向的关联
linkMan.setCustomer(customer);
customer.getLinkMans().add(linkMan);
tx.commit();
}
- 给用户删除角色:
remove
public void demo9(){
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("李兵");
LinkMan linkMan = new LinkMan();
linkMan.setLkm_name("凤姐");
customer.getLinkMans().add(linkMan);
// 条件在Customer.hbm.xml上的set中配置了cascade="save-update" inverse="true"
session.save(customer); // 客户会插入到数据库,联系人也会插入到数据库,但是外键为null
tx.commit();
}```