2011-01-12 64 views
6

我最近修改的一個項目(使用Java,Spring,Hibernate)從Oracle更改爲MySQL。有些情況下,代碼中的某些屬性是MySQL中的保留字,例如「release」。Hibernate:對MySQL使用反引號,但對HSQL不使用

有幾個解決方案,1)重命名代碼中的屬性和隨後的getter/setter方法,還更新調用這些方法的代碼2)使用@Column在代碼中註釋屬性(name =「release」 )。這告訴hibernate在與數據庫交談時引用該名稱。

我寧願遠離第一種方法來減少打破更多東西的機會。第二種方法是「好的」,除了它變成MySQL特定的。在我們的開發中。設置我們使用HSQL,它不喜歡那些列名稱附近的反引號。

我看了org.hibernate.mapping.Column類,我發現它有一個「getQuotedName」方法,如果我可以繼承Column的子類並告訴Hibernate使用我自己的Column類,我可能會覆蓋它。

解決此問題的最佳方法是:a)不必重構代碼庫(更改屬性名稱,getter/setter方法等的b/c),以及b)希望應用程序仍然靜止在HSQL和MySQL中工作。

在屬性文件中有一個屬性可以切換以打開/關閉某些列命名修補程序是合理的。這提醒了我,我嘗試使用自定義命名策略,並重寫「columnName」方法以反引號括住列名稱......即使在MySQL上,這也行不通。

+1

顯然有一個新的屬性hibernate.globally_quoted_identifiers(http://opensource.atlassian.com/projects/hibernate/browse/HHH-4453),可以使用(我相信hibernate 3.5),但沒有記錄( http://opensource.atlassian.com/projects/hibernate/browse/HHH-5673)。 這不是我的選擇,因爲我使用休眠3.3 – codecraig 2011-01-12 11:34:12

+0

我剛剛回答你的問題,我不知道這一個。這是我第一次看到一個問題比答案更爲正確:-) – jpkrohling 2011-01-12 11:38:23

回答

1

後蜱解決方案聽起來不錯。但是,如果它不起作用或者您不想使用特定JPA提供的未公開特徵:爲什麼不使用未在任何(或最常見)數據庫中保留的列名稱。

您不需要更改java屬性的名稱,您只能爲它們指定一個列名稱。

0

使用backtips。這是告訴Hibernate你想讓這個標識符被正確引用的方式。反引號也被用作MySQL的引用字符,這只是一個巧合。這個反引號將被翻譯成你數據庫的引用字符。關於添加引號作爲默認行爲,我不確定Hibernate有這樣的選項。文檔中沒有提到可能的選項,我也不記得在測試套件中看到類似的東西。但我不認爲這是一個好主意,因爲「保留關鍵字」是例外情況,而不是規則。

+0

所以我應該添加@Column(name =「`....`」)到任何屬性是我的代碼中的保留字? 我嘗試使用的命名策略和重寫「列名」的方法來前置和後置反引號列名,但它抱怨,甚至在MySQL有一個例外,如: org.hibernate.MappingException:由不同的代表同一個物理列邏輯列名稱:foobar.`thing_id` =>'`thing_id`'和'thing_id' – codecraig 2011-01-12 11:43:51