要了解的概念:
关系
一对多
多对一
多对多
一对一
单项关联
双向关联
级联操作
需求:客户与订单的关系是一对多
准备项目2
(1)创建项目
hibernate02relation
(2)引入jar,同前一个项目
(3)复制实体、映射、配置、工具类
1、订单表(也可以后面自动创建)
Create Table |
CREATE TABLE `t_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `order_no` varchar(20) DEFAULT NULL, `product_name` varchar(100) DEFAULT NULL, `customer_id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `FKesy3n2gc3fa0s3trrk3tvyv9a` (`customer_id`), CONSTRAINT `FKesy3n2gc3fa0s3trrk3tvyv9a` FOREIGN KEY (`customer_id`) REFERENCES `t_customer` (`c_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4; |
2、创建Order实体类
package name.yaohuan.hibernate.pojo.one2many;
/**
* 订单(多方)
*/
public class Order {
private Long id;
private String orderNo;
private String productName;
//关联客户
private Customer customer;} |
3、修改Customer实体类
package name.yaohuan.hibernate.pojo.one2many;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* 客户(一方)
*/
public class Customer{
private Long id;
private String name;
private Character gender;
private Integer age;
private String level;
//关联订单
private Set<Order> orders = new HashSet<Order>();} |
4、在Customer配置文件中配置一对多
<class name="Customer" table="t_customer">
......
<!-- 一对多配置:属性名称 -->
<set name="orders">
<!-- 外键字段名称 -->
<key column="customer_id"></key>
<!-- 属性所属的类型 -->
<one-to-many class="Order"/>
</set>
</class> |
5、Order配置文件
<hibernate-mapping package="com.**.hibernate.pojo.one2many">
<class name="Order" table="t_order">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="orderNo" column="order_no" length="20"></property>
<property name="productName" column="product_name" length="100"></property>
<!-- 多对一配置 -->
<many-to-one name="customer" class="Customer" column="customer_id" />
</class> </hibernate-mapping> |
6、将映射文件加入hibernte.cfg.xml
<!-- 4、*.hbm.xml文件 -->
<mapping resource="com/**/hibernate/pojo/one2many/Customer.hbm.xml"/>
<mapping resource="com/**/hibernate/pojo/one2many/Order.hbm.xml"/> |
7、测试新增关联数据
public class
One2manyTest {
/** * 需求:1个客户 2张订单 */ @Test public void testCreateOrder(){ //准备数据 Customer customer = new Customer(); customer.setName("老王"); customer.setGender('男'); customer.setAge(18); customer.setLevel("VIP"); Order o1 = new Order(); o1.setOrderNo("210009070001"); o1.setProductName("看透SpringMVC源代码分析与实践"); Order o2 = new Order(); o2.setOrderNo("210009070002"); o2.setProductName("淘宝技术这十年"); Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); //建立一对多双向关系(非必须,也可以建立单项关联) customer.getOrders().add(o1); customer.getOrders().add(o2); o1.setCustomer(customer); o2.setCustomer(customer); //保存数据 session.save(customer); session.save(o1); session.save(o2); //数据提交 tx.commit(); session.close(); } } |
8、测试查询订单
/**
* 查询操作 */ @Test public void testSearch(){ Session session = HibernateUtil.openSession(); Transaction tx = session.beginTransaction(); //查询一个客户,关联查询订单 Customer customer = session.get(Customer.class, 1L); System.out.println(customer.getName()+"的订单:"); Set<Order> orders = customer.getOrders(); for (Order order : orders) { System.out.println(order.getOrderNo()+","+order.getProductName()); } tx.commit(); session.close(); } |