我最近修改的一個項目(使用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上,這也行不通。
顯然有一個新的屬性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
我剛剛回答你的問題,我不知道這一個。這是我第一次看到一個問題比答案更爲正確:-) – jpkrohling 2011-01-12 11:38:23