肉眼上 数据库查表语句更少了
在一对多中 一的一方为主键 多的一方含有外键 默认是让一的一方维护自己的外键 多的一方不维护(没法直接配置多的一方维护 只能配置一的一方不维护才让多的一方维护) 一的一方知道到底谁引用了自己 但是想要只靠插入语句 就把维护外键的问题解决 是不可能的 因为无法干涉到 多的一方的插入操作 只能依靠update 语句来给外键赋值(维护)
//注意 <many-to-one> 是 没有inverse 这个属性的 我用的3.0 约束
但同时 多的一方 也知道自己引用了谁 可以很快的找到自己引用外键的对应的id值
所以 使用inverse 让一的一方不维护 多的一方维护 就可以减少sql语句 节省资源
我们一般建议在一对多双向关联关系中,将一方的inverse属性设置为true,即将主外键的关系交由多方来维护。
打个比方:在一个公司中,是老板认识所有的员工容易,还是所有员工认识老板容易?
看下面这个例子
public class Customer {
private Integer id;
private String name;
//多
private Set<Order> orders=new HashSet<>();
}
public class Order {
private Integer id;
private String name;
private Customer customer;
}
注意 inverse 为false 即默认值
public class Myhibernate {
@Test
public void test1()
{
Session session = HibernateUtil.getNewSession();
Transaction tr = session.getTransaction();
tr.begin();
Customer xiaoming = new Customer("小明");
Order baozi = new Order("包子", xiaoming);
Order da= new Order("大包子", xiaoming);
Set<Order> set=xiaoming.getOrders();
set.add(baozi);
set.add(da);
session.save(xiaoming);
session.save(baozi);
session.save(da);
tr.commit();
session.close();
}
}
逻辑很简单 就是 把两个订单 一个顾客 然后执行
sql 的情况是 5条 三条为必要插入 两条为update 维护外键
把 inverse 设为true 结果只有三条必要插入
我只是小白 有些说错的地方 还请指正