我被困在使用多字段主鍵的數據庫中。我有一個情況,我有一個主表和詳細信息表,其中詳細信息表的主鍵包含的字段也是外鍵的主表。就像這樣:使用休眠/ JPA批註映射多字段主鍵的問題
Master primary key fields:
master_pk_1
Details primary key fields:
master_pk_1
details_pk_2
details_pk_3
在主類中,我們定義休眠/ JPA的註釋是這樣的:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator")
@Column(name = "master_pk_1")
private long masterPk1;
@OneToMany(cascade=CascadeType.ALL)
@JoinColumn(name = "master_pk_1", referencedColumnName = "master_pk_1")
private List<Details> details = new ArrayList<Details>();
而且在細節類我已經定義是這樣的ID和回參考:
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "masterPk1", column = @Column(name = "master_pk_1")),
@AttributeOverride(name = "detailsPk2", column = @Column(name = "details_pk_2")),
@AttributeOverride(name = "detailsPk2", column = @Column(name = "details_pk_2")) })
private DetailsPrimaryKey detailsPrimaryKey = new DetailsPrimaryKey();
@ManyToOne
@JoinColumn(name = "master_pk_1", referencedColumnName = "master_pk_1", insertable=false)
private Master master;
所有這些的目標是我可以創建一個新的主人,添加一些細節,當保存時,JPA/Hibernate會在masterPk1字段中爲主人生成新的身份證,並自動通過將其存入細節記錄,將其存儲在DetailsPrimaryKey類中的匹配masterPk1字段中。至少這就是我一直在看的文檔所暗示的。
實際情況是,hibernate似乎正確地創建和更新數據庫中的記錄,但不會將密鑰傳遞給內存中的詳細信息類。相反,我必須自己手動設置它。
我還發現,如果沒有將insertable=true
添加到master的後端引用中,那麼hibernate會創建sql,並在insert語句中列出兩次master_pk_1字段,導致數據庫拋出異常。
我的問題是簡單的註釋安排是否正確?還是有更好的方法呢?