好久没用Hibernate,导致一对多注解配置,和级联保存搞了好长一段时间,才让代码跑通了。
主类
public class OrderBaseModel {
@OneToMany(mappedBy = "order", cascade = {CascadeType.ALL})
@NotFound(action = NotFoundAction.IGNORE)
public List<OrderItemModel> items = new ArrayList<OrderItemModel>();
}
@OneToMany(mappedBy = “order”, cascade = {CascadeType.ALL})
mappedBy 是对应附类(也就是多的那一方),下面的主类对象名。
cascade是级联保存是的策略,这个还不是很清楚,可以默认先选ALL。
@NotFound(action = NotFoundAction.IGNORE)
这个注解是用来,当附类找不到主类对象时(似乎hibernate会去数据库中找),该附类对象就会被忽略,不会被保存,这是用于级联保存时用的。
附类
public class OrderItemModel {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "order_id", referencedColumnName = "id")
public OrderBaseModel order = new OrderBaseModel();
}
@ManyToOne(fetch = FetchType.EAGER)
- FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。
- FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载
@JoinColumn(name = “order_id”, referencedColumnName = “id”)
一般会有多的一方来维护关系,也就是在附类加上JoinColumn注解
name是指定附类的外键字段名,referencedColumnName 是对应主类对象中的主键名。
级联保存
最后主类级联保存的时候,到手动对附类对象进行设值,不然附类对象是保存不进去的,我本来以为会自动设值,结果怎么都保存不进去,后来手动设了一下,就保存进去了。
如下:
private void saveOrders(List<OrderBaseModel> orders) {
orders.forEach(orderBaseModel -> {
orderBaseModel.items.forEach(orderItemModel -> {
orderItemModel.order = orderBaseModel;
});
});
orderBaseModelRespository.save(orders);
}