有时候我们需要在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”(默认),那么那一方就有责任负责之间的关联关系。