我有兩個表:報告和襯頁。報告由flyleaf表中的外鍵和主鍵的'id'和'index'標識。休眠註解映射一對一的單向相關聯地組合主鍵
的表的模式是:
CREATE TABLE `report` (
`id` int(11) NOT NULL,
`index` varchar(5) NOT NULL,
`nb_page` int(11) DEFAULT NULL
);
ALTER TABLE `report` ADD PRIMARY KEY (`id`,`index`);
CREATE TABLE `flyleaf_t` (
`id` int(11) NOT NULL,
`index` varchar(5) NOT NULL,
`title` varchar(30) DEFAULT NULL,
`author` varchar(30) DEFAULT NULL,
`checker` varchar(30) DEFAULT NULL
);
ALTER TABLE `flyleaf` ADD PRIMARY KEY (`id`,`index`);
ALTER TABLE `flyleaf` ADD CONSTRAINT `flyleaf_ibfk_1` FOREIGN KEY (`id`,`index`) REFERENCES `report` (`id`, `index`);
我使用Hibernate註解來映射這種關聯在單向方式。當我用一個簡單的鍵(非複合),它工作得很好很明顯,但是當我嘗試使用組合鍵的「org.hibernate.TypeMismatchException」拋出與消息:「提供了錯誤的類型類lgmi_cr.Flyleaf的ID。預計:類lgmi_cr.Flyleaf,得了類lgmi_cr.Report」
如果有人已經看到了同樣的情況下,或有關於如何表示這種關聯的單向一對一一種方式的想法,它幫助將不勝感激。
編輯:這是標識究竟是怎麼映射
@Entity
@Table(name="report")
public class Report implements Serializable{
@Id
@Column(name = "id")
private int id;
@Id
@Column(name = "index")
private String index;
@OneToOne
@JoinColumns({@JoinColumn(name="id", referencedColumnName="id"),
@JoinColumn(name="index", referencedColumnName="index")})
private Flyleaf flyleaf;
...
@Entity
@Table(name="flyleaf")
public class Flyleaf implements Serializable {
@Id
@Column(name = "id")
private int id;
@Id
@Column(name = "index")
private String index;
....
而且我得到了這個異常「org.hibernate.TypeMismatchException:錯誤類型類lgmi_cr.Flyleaf的提供的ID預期:類lgmi_cr .Flyleaf,得了類lgmi_cr.Report」
謝謝你的幫助@nkmuturi。您的解決方案能夠正常工作,並反轉單向映射(在報告中映射flyleaf)。你能否提供關於代碼和使用機制的更多細節(我是使用hibernate的新的)? –
Id註釋用於映射到包含單個主鍵的表。但是,對於具有複合主鍵的表,使用IdClass或Embeddable。看到這裏進一步解釋http://www.objectdb.com/java/jpa/entity和本電子書http://www.ebooks.com/602765/beginning-hibernate/linwood-jeff-minter-dave/甚至更多。 – nkmuturi
我剛剛開始閱讀這本書,我覺得它很有趣。我只有另一個問題,在刪除報告時使用這些註釋,相關的flyleaf是否會自動刪除,或者我必須添加一些級聯參數? 有了你的答案,我認爲這個問題得到了解答。 –