hibernate中的一对多的关系映射

xiaoxiao2021-03-01  2

这篇文章讲的是hibernate中对数据库进行的连表操作,如有错误或者不当之处,还希望各位大神批评指正。

多对一映射

目标 假设一个客人Customer可以下多个单Order,一个订单只能对应一个客人

类编写

1.Customer类:

//省略get和set方法 public class Customer { private Integer id ; private String name ; private char sex ; private Set<Order>orders = new HashSet<>() ; }

2.Order类:

//省略get和set方法 public class Order { private Integer id ; private String address ; private Customer customer ; }

*hbm.xml配置

1.Customer.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2018-6-20 17:24:51 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.cn.cmc.model.Customer" table="T_CUSTOMER"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="sequence" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="sex" type="char"> <column name="SEX" /> </property> <!-- 一对多的集合映射: name:对应类中集合的名字 table:对应多的一端的表名 key:对应外键名字 class:对应多的一端的类 inverse : 设置为true表示由对方来维护外键,设置为false表示由本方来维护外键;一般由多的一方维护 cascade : 级联操作 save-update:保存更新,delete:删除 delete-orphan:删除孤儿 lazy:是否延迟加载 one-to-many : 描述集合的类型 --> <set name="orders" cascade="delete" table="T_ORDER" inverse="true" lazy="true"> <key> <column name="order_id" /> </key> <one-to-many class="com.cn.cmc.model.Order" /> </set> </class> </hibernate-mapping>

2.Order.hbm.xml

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2018-6-20 17:24:51 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.cn.cmc.model.Order" table="T_ORDER"> <id name="id" type="java.lang.Integer"> <column name="ID" /> <generator class="sequence" /> </id> <property name="address" type="java.lang.String"> <column name="ADDRESS" /> </property> <!-- 配置多这一端: name:关联的一那一端的名字 class:一那一段的类名 column:一那一段外键的列名 --> <many-to-one name="customer" class="com.cn.cmc.model.Customer"> <column name="order_id" /> </many-to-one> </class> </hibernate-mapping>

注:表名不要和ORACLE系统关键字重复,如Order

插入操作

Order order1 = new Order() ; order1.setAddress("beijing"); Order order2 = new Order() ; order2.setAddress("zhengzhou"); Customer customer = new Customer() ; customer.setName("cmc"); customer.setSex('M'); //注意一的一方不维护外键,因此要给多设置一的对象,否则数据库插入不了外键值 order1.setCustomer(customer); order2.setCustomer(customer); //先插入一的一端再插入多的一端 session.save(customer) ; session.save(order1) ; session.save(order2) ;

注:先插入一的一端再插入多的一端,因为如果先插入多的一端无法确定一的一端的外键值,会多出来几条update语句

查询操作

仅查询多的对象 //此时仅查询Order表 Order order = (Order) session.get(Order.class, 79) ; System.out.println(order.getAddress()); //此时查询Customer表 Customer customer = order.getCustomer() ; System.out.println(customer.getName());

注:仅查询多的一方的一个对象,则不执行查询对应一的一方,在使用到关于一的一方的操作时才发送查询操作(懒加载)

-更新操作

将‘81’号客户的性别改为女 Customer customer = (Customer) session.get(Customer.class, 81) ; customer.setSex('F'); session.update(customer);

删除操作

删除‘80’号顾客 Customer customer = (Customer) session.get(Customer.class, 81) ; session.delete(customer);

注:会级联删除Order

转载请注明原文地址: https://www.6miu.com/read-3650308.html

最新回复(0)