w100224 2017-05-15 15:27 采纳率: 85.7%
浏览 1791
已采纳

hibernate一对多级联保存机制是什么

Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

    Order order = new Order();
    order.setOrderName("订单2");

    Ticket ticket = new Ticket("优惠券1",order);
    Ticket ticket1 = new Ticket("优惠券2",order);
    order.getTickets().add(ticket);
    order.getTickets().add(ticket1);

    session.save(order);

    transaction.commit();
    session.close();
    sessionFactory.close();
 我明明只执行了订单order的save操作,其中一个order对应多个ticket优惠券,为什么输出的sql中 是执行了对应的三个insert语句后,又执行了两次ticket优惠券的update?这里的update语句是干啥的,一对多级联保存机制是什么

这是打印的sql:
Hibernate:
insert
into
bc_order
(orderName)
values
(?)
Hibernate:
insert
into
bc_ticket
(ticketName, orderId)
values
(?, ?)
Hibernate:
insert
into
bc_ticket
(ticketName, orderId)
values
(?, ?)
Hibernate:
update
bc_ticket
set
orderId=?,
p_index=?
where
ticketId=?
Hibernate:
update
bc_ticket
set
orderId=?,
p_index=?
where
ticketId=?

  • 写回答

1条回答 默认 最新

  • AngusC· 2017-05-15 15:30
    关注

    原因很简单,你问为什么会发出很多的update的SQL语句(如果你将SET标签添加上inverse="true"就不会有这样的情况,反转交给多的一方来维护),因为你现在是在让一的一方来维护关系:举个例子class和 student测试存储的方法中,
    (1)你要先NEW出几个Order 对象
    (2)创建一个SET集合,并添加Order 实体对象
    (3)创建一个class对象,给这个实体的保留Order SET集合的属性Order 赋值
    (4)session.save(class);
    你如果你要直接运行这个方法的话,会抛出transiont objecte excption 异常,因为在(1)中你的Order 对象为transient状态,要转化为persistent状态,要session.save(Order );....都要save;
    ----此时你会在输出端会看到hibernate发出了SQL insert语句,但是外键现在没有值
    此时你的数据库student表中,外键字段class_id那列为里面都是NULL值,
    接着执行,当session.save(class);
    -----此时你才会看到hibernate发出了SQL update语句:
    只要就是为了update Order set class_id=".."where id="..",故存在几个Order 实体对象,就会发出几个update 。
    通过上面可以看出它的缺点也就是:
    第一:如果你将Order 表里的class_id字段设置为空,你就会无法保存数据;
    第二:在class一方的一端会发出多余的update语句,你可以想象如果我要存1000个订单,那么你在一的一方维护关系,它就会发出1000条update。。。。。。
    一般不重要做,都是添上inverse=“true”反转给多的一方维护即可!
    你可以在Eclipe 写测试方法设置断点来调试看下!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码