2015-01-08 53 views
0

欲瞭解更多信息,請參閱my other question如何用硬編碼值替換@JoinColumn?

我想加入我的Employee實體類到Code實體類,但代碼PK是複合(DOMAIN,CODE),因爲它列出了許多不同的代碼域,但Employee類/表中的代碼全部來自一個單一的域,不需要在Employee類/表中有一個域字段(因爲它永遠都是一樣的)。

我可以通過在僱員表和硬編碼的值(例如EMP_TYPE),而不是一個冗餘列使用CODE字段加入僱員代碼

如果我員工類/表確實有多餘的專欄中,我會參加這樣的:

@JoinColumns({ 
     @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), 
     @JoinColumn(name = "DOMAIN", referencedColumnName = "DOMAIN)}) 
    @ManyToOne(optional = false) 
    private Code sharedStatute; 

,但我真的不希望有額外的列在DB和因爲它永遠都是一樣的。

我試圖完成將相當於SQL中的以下內容:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type 
FROM Employee e JOIN Code c 
ON e.emp_type_code = c.code 
WHERE c.domain = 'EMP_TYPE' 

,而不是在僱員表中增加一個字段domain和填充每一個紀錄相同的值(「EMP_TYPE」 )然後執行:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type 
FROM Employee e JOIN Code c 
ON e.emp_type_code = c.code 
AND e.domain = c.domain 

前者效率更高,因爲它使我不必擁有冗餘字段。所以我試圖做的是同樣的事情,但在JPA

你們中的一些人可能會說「爲什麼不爲每個代碼設置單獨的查找表」,但我認爲這是一個糟糕的主意,並導致數據庫表和相應的應用程序實體混亂。按代碼類型(或域)分區單個代碼查找表要好得多。

+0

看到這個問題,而不是 https://stackoverflow.com/questions/8924928/hibernate-how-to-use-a-constant-as-part-of-composite-foreign-reference –

回答

3

這應該工作?

@JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE") 
@Where(clause = "domain = 'EMP_TYPE'") 
@ManyToOne(optional = false) 
private Code sharedStatute; 
+0

你在哪裏得到' @ Where從哪裏註釋?似乎不在'javax下。持久性' – amphibient

+0

這是一個休眠功能,我認爲它已經成爲JPA2,但顯然不是。 – Affe

+0

不幸的是沒有...在JPA中有不同的方法來完成同樣的事情嗎? – amphibient

0

有一種方法只用javax.persistence註釋來做到這一點:

@JoinColumns({ 
    @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), 
    @JoinColumn(name = "CODE_TABLE_NAME.DOMAIN", referencedColumnName = "'EMP_TYPE'")}) 
@ManyToOne(optional = false) 
private Code sharedStatute; 

注意單引號在referencedColumnName,這是你正在尋找的字符串值。

但是,如果在實體中有多個Code對象,DOMAIN上的連接只會在jpa中完成一次,從而導致不好的結果。目前,我通過讓這些場地負荷變得遲緩來規避這種情況,但這並不理想。

更多信息here

+1

有人可以解釋downvote? –

+0

我可以解釋downvote:單引號字符串不存在於Java中。單引號僅用於單個字符。也許你的意思是:'referenceColumnName =''EMP_TYPE'「'? – LordOfThePigs

+0

謝謝,我想我搞砸了,當我讓我的工作代碼看起來更像是提問者使用的。希望有人告訴我有關錯字':-) –