我有使用策略GenerationType.TABLE
生成的ID的父級和子級實體,因爲我正在使用MySQL數據庫。爲什麼Hibernate使用序列
如果我在沒有指定ID的情況下創建父項(即,首次創建父項),請向其中添加新的子項並保存父項,然後hibernate按預期方式工作並使用MySQL AUTO_INCREMENT列功能。但是,如果我創建了一個父項並指定了一個ID(例如,實例化了一個已經被保留的父項),那麼向它添加一個子項並保存該子項,然後休眠問題發出select sequence_next_hi_value from hibernate_sequences ...
並將其用作孩子的PK。同樣,如果我通過session.get(Parent, 1)
從數據庫中獲取父實例化一個父對象,向它添加一個新的子對象,然後保存父對象或子對象,然後hibernate使用序列來獲取對象的PK。
如果我創建了足夠的新父母(準確地說是32767)來運行mysql AUTO_INCREMENT計數器,那麼由於主鍵不夠獨特而導致失敗。
這裏是我的父母和孩子的實體(名爲位置和類別,分別對應)
@Entity(name="location")
public class Location {
@Id @GeneratedValue(strategy=GenerationType.TABLE) @Column(name="location_id")
private int id;
@OneToMany(mappedBy="location")
@Cascade(CascadeType.SAVE_UPDATE)
private List<Category> categories;
...
}
@Entity(name="category")
public class Category {
@ID @GeneratedValue(strategy=GenerationType.TABLE) @Column(name="category_id")
private int id;
@ManyToOne @JoinColumn(name="location_id")
private Location location;
}
下面是Hibernate代碼:
Hibernate: select sequence_next_hi_value from hibernate_sequences where sequence_name = 'category' for update
Hibernate: update hibernate_sequences set sequence_next_hi_value = ? where sequence_next_hi_value = ? and sequence_name = 'category'
Hibernate: insert into category (location_id, category_id) values (?, ?)