簡體   English   中英

Hibernate單向OneToMany無法與復合ID一起使用

[英]Hibernate Unidirectional OneToMany Not Working with composite id

我已經在鍵盤上b了兩天,試圖找出答案...

背景知識:我們有一個使用Perl代碼庫建立的數據模型,該數據庫通過ODBC向數據庫運行直接的本機SQL語句。 由於某些原因,我們決定用Java重寫代碼...我認為使用Hibernate定義所有映射是一個好主意。 我們不想編輯數據模型。

為了簡單起見,我只能用部分數據模型來表達問題。 我們有實體“ Job”,“ JobDatabase”和“ JobTable”。

Job的作業名稱為PK。 數據庫具有作業名,名稱的PK。 表的PK為job_name,src_database_name,name。 如您所料,Job與JobDatabase具有OneToMany關系,而Database與JobTable具有OneToMany關系。

為了進行此測試,我從空表開始,嘗試創建一些示例數據。 我可以插入Job和JobDatabase,但是當我嘗試插入JobTable時,Hibernate會引發錯誤。 更准確地說,那就是它抱怨的地方。 它不會開始執行我的代碼,因為它檢測到映射錯誤。 但是,如果刪除JobDatabase和JobTable之間的關聯,它將正確插入所有Job和JobDatabase記錄,沒有錯誤。

樣本類(所有字段都有getter / setter方法……還有許多其他字段):

@Entity
@Table(name="Job")
public class Job implements Serializable {
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumn(name = "job_name", referencedColumnName = "job_name")
    private Set<JobDatabase> databases;
}

@Entity
@Table(name="JobDatabase")
public class JobDatabase implements Serializable {
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @Id
    @Column(name="name",nullable = false)
    private String name;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinColumns({
            @JoinColumn(name = "job_name", referencedColumnName = "job_name"),
            @JoinColumn(name = "name", referencedColumnName = "src_database_name")
    })
    private Set<JobTable> tables;
}

@Entity
@Table(name="JobTable")
public class JobTable implements Serializable{
    @Id
    @Column(name="job_name",nullable = false)
    private String jobName;

    @Id
    @Column(name="src_database_name",nullable = false)
    private String srcDatabaseName;

    @Id
    @Column(name="name",nullable = false)
    private String name;
}

錯誤:

Exception in thread "main" org.hibernate.MappingException: Unable to find column with logical name: src_database_name in JobDatabase

我不斷收到此錯誤。 我不明白為什么它要在“擁有”映射的實體中查找引用的列。 src_database_name確實僅存在於JobTable中-在JobDatabase中被稱為“名稱”。 JobTable也有一個“名稱”字段,但它引用表的名稱。

您的JobDatabase表中需要有src_database_name列。 或者,您可以將src_database_name更改為其他列名。

對於復合鍵,您的源表中必須存在參考列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM