你的位置:首页 > 软件开发 > Java > Hibernate —— 映射关联关系

Hibernate —— 映射关联关系

发布时间:2016-10-12 17:00:15
一、映射多对一关联关系。1.单向的多对一(1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户。从 Order 到 Customer 是多对一关联关系。(2)创建 Customer 和 Order 表。CREATE TABLE cu ...

一、映射多对一关联关系。

1.单向的多对一

(1)以 Customer 和 Order 为例:一个用户可以发出多个订单,而一个订单只能属于一个客户。从 Order 到 Customer 是多对一关联关系。

(2)创建 Customer 和 Order 表。

Hibernate —— 映射关联关系Hibernate —— 映射关联关系
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 的一端。

Hibernate —— 映射关联关系Hibernate —— 映射关联关系
@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 —— 映射关联关系Hibernate —— 映射关联关系
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 —— 映射关联关系Hibernate —— 映射关联关系
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>删除

Hibernate —— 映射关联关系Hibernate —— 映射关联关系
@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 (#换成@)。

可能感兴趣文章

我的浏览记录