2017-03-16 49 views
1

我有兩個表:報告和襯頁。報告由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」

回答

1

我希望你可以分享你是如何映射在Hibernate中這些關係?這是我會怎麼做:

1)使用@Embeddable標註每個複合表映射爲一個單獨的類的對象,如:

@Embeddable 
public class ReportPK implements Serializable { 

    @Basic(optional = false) 
    @Column(name="id") 
    private int id; 
    @Basic(optional = false) 
    @Column(name="index") 
    private String index; 
... 

與實體類會是什麼樣子:

@Table(name="report") 
public class Report implements Serializable { 

    @EmbeddedId 
    protected ReportPK id; 
... 

2)在扉頁實體類,你可以添加單向映射爲:

@OneToOne 
    @JoinColumns({ 
    @JoinColumn(name="id", 
     referencedColumnName="id"), 
    @JoinColumn(name="index", 
     referencedColumnName="index"), 
    }) 
    private Report report; 
... 

也許如果這沒有幫助,你可以更具體。 :-)

+0

謝謝你的幫助@nkmuturi。您的解決方案能夠正常工作,並反轉單向映射(在報告中映射flyleaf)。你能否提供關於代碼和使用機制的更多細節(我是使用hibernate的新的)? –

+0

Id註釋用於映射到包含單個主鍵的表。但是,對於具有複合主鍵的表,使用IdClass或Embeddable。看到這裏進一步解釋http://www.objectdb.com/java/jpa/entity和本電子書http://www.ebooks.com/602765/beginning-hibernate/linwood-jeff-minter-dave/甚至更多。 – nkmuturi

+0

我剛剛開始閱讀這本書,我覺得它很有趣。我只有另一個問題,在刪除報告時使用這些註釋,相關的flyleaf是否會自動刪除,或者我必須添加一些級聯參數? 有了你的答案,我認爲這個問題得到了解答。 –