我有一个一对多映射,其中“ Item
”类作为父类,“ ItemSizeCost
”类作为子类。
我在父类中添加了@OneToMany
和@JoinColumn
。
当我尝试保留父项时,我看到休眠发出三个sql语句
insert into item (category_id, description, name) values (?, ?, ?)
insert into item_size_cost (cost, item_id, size_id) values (?, ?, ?)
update item_size_cost set item_id=? where id=?
我想了解后面两个语句(插入child并更新child)背后的原因。经过一番谷歌搜索后,我发现原因可能与休眠状态的刷新顺序有关,但无法完全理解。任何人都有了解Hibernate刷新顺序的良好链接吗?任何解释将不胜感激。我在下面提到我的课程-
Item -
@Entity
@Table(name="item")
public class Item {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="category_id")
private Category category;
@Column(name="name")
private String name;
@Column(name="description")
private String description;
@OneToMany(fetch = FetchType.LAZY,
cascade= {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE})
@JoinColumn(name="item_id")
List<ItemSizeCost> itemSizeCostList;
.....
}
ItemSizeCost -
@Entity
@Table(name="item_size_cost")
public class ItemSizeCost {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private int id;
@ManyToOne(fetch = FetchType.LAZY)
/*@JoinColumn(name="item_id")*/
private Item item;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="size_id")
private Size size;
@Column(name="cost")
private double cost;
....
}
答案 0 :(得分:0)
最后两个语句的原因是双向映射以及外键可以为null的事实。
Vlad Mihalcea撰写了一篇有关此主题的出色文章。他是Hibernate提交者:https://vladmihalcea.com/merge-entity-collections-jpa-hibernate/