Hibernate 笔记二(多表设计之一对多)
来源:互联网 发布:压缩 linux 编辑:程序博客网 时间:2024/05/30 05:23
Hibernate 多表设计之一对多
示例:用户表和订单表关系为一对多的关系,一个用户可以有多个订单,但是一个订单只能对应一个用户
- Customer.java
在“一”的一方(Customer)用Set来保存所有订单引用
public class Customer { private Integer id; private String name; private Set<Order> orders = new HashSet<>(); // Get和Set 代码略过}
- Order.java
直接保存Customer 的引用
public class Order { private Integer id; private String orderName; private Customer customer; // Get和Set 代码略过}
ORM 映射文件表达一对多关系、多对一
用set节点来描述一对多
<set name="orders" inverse="false"> <key column="cid"></key> <one-to-many class="Order"/> </set>
key节点用来描述外键列名,one-to-many 指定引用Customer作为外键的表所对应用java Bean 类 ,Set 中的Inverse 属性代表“是否不维护外键”True 替表不维护,False 代表维护,只能在“一”的一方放弃维护
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.longdenghui.one2many2"> <class name="Customer" table="t_customer"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="name" column="name"></property> <set name="orders" inverse="false"> <key column="cid"></key> <one-to-many class="Order"/> </set> </class></hibernate-mapping>
Order.hbm.xml 中使用
<many-to-one name="customer" column="cid"></many-to-one>
来描述多对一的关系
Order.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.longdenghui.one2many2"> <class name="Order" table="t_order"> <id name="id" column="id"> <generator class="native"></generator> </id> <property name="orderName" column="order_name"></property> <many-to-one name="customer" column="cid"></many-to-one> </class></hibernate-mapping>
测试
Configuration conf = new Configuration().configure(); Session session = conf.buildSessionFactory().openSession(); Transaction tr = session.beginTransaction(); Customer c1 = new Customer(); c1.setName("龙登辉"); Order o1 = new Order(); Order o2 = new Order(); o1.setOrderName("娃哈哈"); o2.setOrderName("洗衣粉");// o1.setCustomer(c1);// o2.setCustomer(c1); c1.getOrders().add(o1); c1.getOrders().add(o2); session.save(c1); session.save(o1); session.save(o2); tr.commit();
因为在Cusotmer.hbm.xml 中写了Inverse 属性为False 所以Customer 会维护外键,不用再写下列两行代码
o1.setCustomer(c1); o2.setCustomer(c1);
如是inverse 属性为False 为True 则代表Customer 放弃维护外键,所以上列两行代码必须加上,不然在Order表中的外键就为null了,
cascade 属性(save-update | delete | delete-orphan | all | all-delete-orphan)
级联保存或更新 使用cascade属性值选用“save-update”在Order 表中保存 Cutomer 表的主键,所以删Customer 表需要先删除Order 表中的数据,而在Customer.hbm.xml 文件中设置了级联删除的话可以使用以下代码直接删除
Customer c = (Customer) session.get(Customer.class, 1);session.delete(c);
save-update(级联保存或更新)
在“多”的一方中保存或更新“一”的一方的引用时,Hibernate 会帮我们将这些变化同步到数据库中。
delete-orphan 孤儿删除
在“多“的一方中删除所保存的“一”的一方的引用时,代表和Order表所对应的数据解除关系,Order 表中被解除关系的数据被称为孤儿,Hibernate 会自动将孤儿数据删除。delete 级联删除
当调用session中的delete() 方法 ,想要删除一个Customer(“一”的一方)对象时,Hibernate 会将“多”的一方保存的引用所对应的数据库的数据删除。all : save-update 和 delete 整合
all-delete-orphan : 三个整合
- Hibernate 笔记二(多表设计之一对多)
- hibernate初探之一对多映射(二)
- hibernate之一对多
- Hibernate之一对多和多对一映射笔记
- Hibernate之一对多(注解实现)
- Hibernate学习笔记8--关联关系之一对多
- Hibernate之一对多关联
- Hibernate初探之一对多
- Hibernate笔记三,表设计之多对多
- 设计模式之一对多
- hibernate多表操作之一对多的单项操作
- hibernate多表操作之一对多的双向关联
- hibernate初学8 多表操作之一对多操作
- Hibernate表关系之一对多(inverse详解)
- Hibernate表关系之一对多(inverse详解)
- Hibernate表关系之一对多(inverse详解)
- Hibernate表关系映射之一对多映射
- Hibernate(1)关联映射之一对多
- window系统,wamp下nginx配置TP使用
- Hibernate 一对一连接表单向关联
- PHP强制下载文件
- JSP开发实战一
- 软件框架和软件架构的区别?
- Hibernate 笔记二(多表设计之一对多)
- android 资源文件处理工具
- 国密SKF接口函数介绍之二:访问控制函数
- laravel使用七牛组件上传图片
- Java 并发:线程间通信与协作
- Hibernate 一对多外键单向关联
- 关于我及新年计划
- 运维进阶
- 26.图文混排