2014-11-04 56 views
0

JPA/Hibernate映射我有兩個表:與@SecondaryTable註釋

part { 
    int id; --> primary key, auto generated 
    varchar poNo; 
    varchar partNo; 
    varchar partDesc; 
    varchar eccNo; 
    ... 
} 

supplement { 
    int id; --> primary key 
    varchar poNo; --> foreign key 
    varchar partNo; --> foreign key 
    varchar venderPartNo; 
    varchar exportHSCCode; 
    ... 
} 

我定義一個實體,如下:

@Entity 
@Table(name="part") 
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"}) 
public class Part{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String poNo; 

    private String partNo; 

    private String partDesc; 

    private String eccNo; 
    @Column(table="supplement") 
    private String vernderPartNo; 
    @Column(table="supplement") 
    private String exportHSCCode; 
    ... 
    getter and setter... 
} 

問題1:

當我堅持一個部分,我不想在補充表中插入一行,是否有任何配置或註釋可以得到它?因爲根據上述實體和配置,當我堅持一個部分,Hibernate會生成對我來說兩個插入SQL語句:

insert into part(poNo, partNo, partDesc, eccNo) values (?,?,?,?) 
insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?) 

,我想是,堅持一個部分的時候,我沒有對任何申請設定值補充的,那麼只有一個INSERT語句:(?,?,?,) INSERT INTO部分(PONO,PARTNO,partDesc,eccNo)值

這可能嗎?

問題2:

從上面的表架構中,PONO和PARTNO是外鍵,這意味着,每一個相關的部分和補充,這兩個場應該具有相同的值。但是我不知道如何在使用上面的配置時將這兩列值映射到補充表。

對於Hibernate的正常運行,當它處理一個部分時,它總是生成兩個我上面提到的insert語句,而對於secondary表,它的insert語句只包含那些指定了它的表名的字段,所以爲補充,它的INSERT語句:

insert into supplement(vernderPartNo, exportHSCCode, id) vaules (?,?,?) 

那麼,有沒有有什麼辦法可以讓Hibernate生成如下插入語句:

insert into supplement(poNo, partNo, vernderPartNo, exportHSCCode, id) vaules (?,?,?,?,?) 
+0

對於第一個問題,我在之前的測試中犯了一個錯誤,並且我發現使用@SecondaryTable已經可以解決它,只是沒有爲補充表設置任何字段的值,然後hibernate會跳過插入記錄到這個表。 – Aaron 2014-11-11 11:09:16

回答

0

1)請嘗試以下(我希望它可以工作,但Hibernate可能不會pl唉這種方式):

@Entity 
@Table(name="part") 
@SecondaryTable(name="supplement", pkJoinColumns ={@PrimaryKeyJoinColumn="id"}) 
public class Part{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String poNo; 

    private String partNo; 

    private String partDesc; 

    private String eccNo; 
    @Column(table="supplement") 
    @Basic(optional=true) 
    private String vernderPartNo; 
    @Column(table="supplement") 
    @Basic(optional=true) 
    private String exportHSCCode; 
    ... 
    getter and setter... 
} 

2)你需要更改您的鍵控部分。你已經將它的主鍵定義爲一個自動遞增的整數......這將成爲你的補充表中的外鍵。這實際上是JPA希望你這麼做的原因(我認爲這是因爲JPA規範將自然鍵稱爲「遺留」)。你這裏有幾個選項:

  1. 請從部分實體的自動增量營造「composite key」類只是PONO和PARTNO,並添加類的字段部分。這將成爲你的Part主鍵,並且將成爲你的補充表中使用的外鍵。
  2. 忘記外鍵,而是添加@UniqueConstraint到您的部分對於那些兩列(這不會解決你的外鍵的問題,但它確實執行你所確定的約束)
+0

謝謝你回答我。對於問題1,我嘗試了你的建議,但不幸的是,它沒有奏效。它仍然有一個插入語句來插入一行來補充。對於問題2,第一個選項可能是一個解決方案,但它不適合我的項目。 – Aaron 2014-11-04 09:11:49