Hibernate的多表关联关系映射

有时候我们需要在XML中配置好各种主外键关系 然后就可以执行代码自动生成数据表了。

我们以顾客和订单为例, 顾客与订单是多对一的关系,一个顾客对应多个订单,

 

实体类的编写

Customer与 Order的配置

<hibernate-mapping package="com.gyf.hibernate.domain">
	
	<class name="Order" table="t_order">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		
		<!-- 定单名称 -->
		<property name="name"></property>

		<!-- 多个定单对应一个客户,Hibernate可以双向描述一对多的关系
			set中 name写的是实例的属性
		  -->
		<many-to-one name="customer" class="Customer" column="customer_id"></many-to-one>
	</class>
</hibernate-mapping>
<hibernate-mapping package="com.gyf.hibernate.domain">
	
	<class name="Customer" table="t_customer">
		<id name="id" column="id">
			<generator class="native"></generator>
		</id>
		<property name="name" length="20"></property>

		<!-- 一个客户有多个定单,Hibernate可以双向描述一对多的关系
			set中 name写的是实例的属性
		  -->
		<set name="orders">
			<!-- column指的是Order表中的外键  -->
			<key column="customer_id"></key>
			<one-to-many class="Order"/>
		</set>
	</class>
</hibernate-mapping>

 

进行测试

@Test
	public void test1(){
		
		Session session = HibernateUtils.openSession();
		session.beginTransaction();
		
		//客户
		Customer customer = new Customer();
		customer.setName("gyf");
		
		//定单
		Order order1 = new Order();
		order1.setName("iphone8");
		
		Order order2 = new Order();
		order2.setName("iphonex");
		
		//维护客户与定单的关系
		customer.getOrders().add(order1);
		customer.getOrders().add(order2);
		
		//维护定单与客户的关系
		order1.setCustomer(customer);
		order2.setCustomer(customer);
		
		session.save(customer);//执行三条insert sql语句
		session.save(order1);//执行一条update sql语句,维护外键关系
		session.save(order2);//执行一条update sql语句,维护外键关系
		
		
		
		session.getTransaction().commit();
		session.close();
		
	}

   这个一共执行了五句代码,三条Insert 最后再执行update将customer的ID插入 而将外检维护给另一个 就只会执行三句代码

设置外键维护的方式

  • 修改Customer的配置文件,添加一个inverse选项
  • inverse是hibernate双向关系中的基本概念。inverse的真正作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系。

一对多的删除

猜你喜欢

转载自blog.csdn.net/weixin_41298572/article/details/88234875
今日推荐