hibernate基础之多表查询

  1. 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"/>
  1. 一对多关系保存一边是否可以:
    不可以,报一个瞬时对象异常:持久态对象关联了一个瞬时态对象

  2. 一对多的级联操作:
    级联:操作一个对象时,是否会同时操作其关联的对象。

  3. 级联保存或更新:
    关键字cascade

cascade="save-updage"
  1. 级联删除:
    删除一边的时候,同时另一方的数据也一并删除,关键字 cascade=“delete”

  2. 一对多设置了双向关联产生多余SQL语句的处理方法:
    使一方放弃外键维护权:一的一方放弃,在set上配置inverse=“true”

  3. 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>```
  1. 多对多建立的双向关系必须有一方放弃外键的维护,一般是被动方放弃外键的维护权。
  2. hibernate的多对多操作不可以保存一边
  3. 多对多的级联操作同一对多的级联操作
  4. 给用户改选角色:
    先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();
	}
  1. 给用户删除角色:
    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();
	}```

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
引用\[1\]:使用@ManyToOne注解可以实现关联非主键列的连查询。在这个例子中,通过@ManyToOne注解将CaseInfoModel与另一个关联起来,使用@JoinColumn指定了关联的列名和参考列名。\[1\] 引用\[2\]:在Hibernate中,可以使用OID数据查询和OGN数据查询方式进行连查询。在这个例子中,通过session.get方法查询User中的数据,并打印结果。\[2\] 引用\[3\]:如果需要从两个查询带有where条件的数据,可以使用HQL语句。在这个例子中,使用了select语句和where条件来查询FileModel和StatusModel中符合条件的数据。\[3\] 综上所述,以上是Hibernate中连查询的一些示例。具体的连查询方式还取决于具体的业务需求和数据模型。 #### 引用[.reference_title] - *1* *3* [Hibernate联查](https://blog.csdn.net/Memory166/article/details/112365946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [hibernate基础学习--多关联数据查询](https://blog.csdn.net/diaochifu3136/article/details/101329656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值