一、映射多对一关联关系。1.单向的多对一(1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户。从 Order 到 Customer 是多对一关联关系。(2)创建 Customer 和 Order 表。CREATE TABLE cu ...
一、映射多对一关联关系。
1.单向的多对一
(1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户。从 Order 到 Customer 是多对一关联关系。
(2)创建 Customer 和 Order 表。
CREATE TABLE customer ( customer_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY , customer_name VARCHAR(50))CREATE TABLE `order` ( order_id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, order_name VARCHAR(50), customer_id INT(11))
<4>查询
①查询 n 的一端,但是不使用查询出来关联的 1 的一端的对象。
@Testpublic void testMany2OneGet() { Order order = (Order) session.get(Order.class, 1); System.out.println(order.getCustomer().getClass().getName());}
结果:打印了 3 条 INSERT 语句,2 条 UPDATE 语句
先保存 n 的一端,再保存 1 的一端。
@Testpublic void testMany2OneBothSave() { Customer customer = new Customer(); customer.setCustomerName("cc"); Order order = new Order(); order.setOrderName("order5"); order.setCustomer(customer); Order order2 = new Order(); order2.setOrderName("order6"); order2.setCustomer(customer); customer.getOrders().add(order); customer.getOrders().add(order2); session.save(order); session.save(order2); session.save(customer);}
打印 SQL :
Hibernate: insert into hibernate.order (order_name, customer_id) values (?, ?)Hibernate: insert into hibernate.order (order_name, customer_id) values (?, ?)Hibernate: insert into hibernate.customer (customer_name) values (?)Hibernate: update hibernate.order set order_name=?, customer_id=? where order_id=?Hibernate: update hibernate.order set order_name=?, customer_id=? where order_id=?Hibernate: update hibernate.order set customer_id=? where order_id=?Hibernate: update hibernate.order set customer_id=? where order_id=?
结果:打印了 3 条 INSERT 语句,4 条 UPDATE 语句。原因,双方都维护这关联关系。
②双方都维护关联关系,即没有设置 inverse 属性,对 order 表中的 customer_id 列添加非空约束(需要更改两个地方)。
先保存 n 的一端,再保存 1 的一端,会抛出异常。
org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : com.nucsoft.hibernate.Order.customer -> com.nucsoft.hibernate.Customer
③ 1 的一端放弃维护关联关系,只由 n 的一端来维护。即设置 Customer.hbm.
先保存 1 的一端,后保存 n 的一端。
Hibernate: insert into hibernate.customer (customer_name) values (?)Hibernate: insert into hibernate.order (order_name, customer_id) values (?, ?)Hibernate: insert into hibernate.order (order_name, customer_id) values (?, ?)
结果:只会发送3条 INSERT 语句。
④总结:
介绍了双向的多对一的下的保存操作,若都维护关联关系,则会多出 UPDATE 语句。且若外键存在非空约束时,不能先保存 n 的一端。
所以在进行 Hibernate 双向多对一保存的时候,最好的做法就是:
1 的一端放弃维护关联关系,即 设置 set 节点的 inverse 属性为 true。同时在保存的时候先保存 1 的一端,后保存 n 的一端。
<2>删除
@Testpublic void testMany2OneBothDelete() { Customer customer = (Customer) session.get(Customer.class, 5); session.delete(customer);}
<4>查询
@Testpublic void testMany2OneBothGet() { Customer customer = (Customer) session.get(Customer.class, 5); System.out.println(customer.getOrders().getClass());}
原标题:Hibernate —— 映射关联关系
关键词:Hibernate
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。