2017-07-13 108 views
0

我現在試圖用hibernate從mysql數據庫中檢索數據。但是,我遇到了org.hibernate.AnnotationException,它提醒我不能使用單個屬性。我的代碼如下,請看看。休眠多對一映射使用主要複合鍵中的一列

@Entity 
@Table(name = "master") 
public class Master implements Serializable { 
    @EmbeddedId 
    private MasterPK id; 

    @Column 
    private String description; 

    @Column 
    private String username; 

    @Column 
    private String emailaddress; 

    .... 

    @OneToMany(mappedBy = "master") 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private List<Child> childs; 

    .... 
    // Getter and setter 
} 


@Entity 
@Table(name = "child") 
public class Child implements Serializable { 

    .... 

    @Column 
    private String code; 

    @Column 
    private String isGolden; 

    @Column 
    private Date startServiceDate; 

    @Column 
    private Date endServiceDate; 

    @ManyToOne 
    @JoinColumn(name="id_a", referencedColumnName="id_a") 
    private Master master; 

    .... 
    // Getter and setter 

} 


@Embeddable 
public class MasterPK implements Serializable { 

    @Column(name="id_a") 
    private String idA; 

    @Column(name="id_b") 
    private String idB; 

    ... 
    //Classes generated by JPA Tools e.g. getter, setter, comparator 
} 

我嘗試使用master.id_a和child.id_a到主表和子表的映射,而ID_A和ID_B是主表的主鍵。因此,休眠拋出異常,我無法啓動我的應用程序。但我仍然希望僅通過id_a映射兩個表,因爲子表沒有id_b。而設計是,主表中的每一行都可能映射到多個子表。我可以針對這種情況提出一些建議嗎?非常感謝!

回答

0

在我看來,你「交換」了實體,那就是你定義的複合pk似乎實際上是典型子表的主鍵。 你可以發佈實際表格的模式嗎?這可能是幫助

+0

感謝您的幫助。我更新了我的代碼。實際上,子表只是其中一個擴展表,用於存儲主表 –

+0

中的額外詳細信息。主表和子表只共享FK id_a。主表使用id_a和id_b作爲主鍵(id_a也是唯一的,但需要將id_b作爲主鍵用於其他目的,表不能更改)。子表只有id_a列。 –

+0

對不起,我對這個設計感到困惑,當'id_a'單獨是一個好的pk時,在主表中結合id_a和id_b作爲pk的目的是什麼?無論如何,你使用hibernate的問題是,子實體必須引用master的主鍵的所有列,而不僅僅是 'id_a'。 – gtosto