2012-06-30 84 views
6

我有一個經典的休眠@Inheritance(strategy=InheritanceType.SINGLE_TABLE)@DiscriminatorFormula。它工作正常。但是,數據庫中的@DiscriminatorValue約有500個不同的值,我需要將它們中的大約30個映射到Java類(子級),其餘的映射到父級Java類。映射休眠實體爲未知DiscriminatorValue繼承類型.SINGLE_TABLE

該問題可以建模爲Animal類的示例繼承。

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorFormula("...") 
public class Animal implements Serializable { 
    ... 
    @Column 
    public String getName() { ... } 
} 

所以我有大約30動物的子類在Java代碼中定義的@DiscriminatorValue。當Hibernate爲鑑別器找到未知值時,它會拋出WrongClassException。但是,我需要將這些未知的鑑別值映射到一個實體,最好的是Animal類。 (在這種情況下,我只需要使用方法getName()。)

我知道一個解決方案是將一個SQL CASE放入@DiscriminatorFormula中,但我必須聲明所有30個已知鑑別符值(加上更多I將需要添加其他)。所以我正在尋找更靈活的解決方案。

P.S.這是一個遺留代碼,所以我不能更改模型。

+3

確實很好的問題!恐怕你堅持SQL CASE解決方案。像'@ DiscriminatorColumn'或'@ DiscriminatorFormula'註解那樣的'forceDefault = true'選項(映射到根類而不是異常)將是很好的選擇。在你的工作代碼中還是缺少root類中的@ DiscriminatorValue?如果不是,也許你可以用這種方式強制默認映射。現在無法嘗試,但我懷疑它,如果使用了@ DiscriminatorColumn,則會爲缺少的@ DiscriminatorValue生成默認值。 – tscho

+0

'@ DiscriminatorValue'在代碼和示例中都已丟失。這個細節讓我深入瞭解了Hibernate代碼並找到了解決方案。見下圖。 – xmedeko

回答

6

tscho已經指出了我的正確方向,所以我能夠爲我的案件找到解決方案。 @DiscriminatorValue評估特殊值@DiscriminatorValue("null")@DiscriminatorValue("not null")。第二個是我的權利。

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorFormula("...") 
@DiscriminatorValue("not null") 
public class Animal implements Serializable { 
    ... 
    @Column 
    public String getName() { ... } 
} 
+0

非常好!你可以提供一個鏈接,這是記錄在案或只是_documented在code_? – tscho

+0

我在代碼中找到它,請參閱SingleTableEntityPersister類。您可以通過[Google搜索](https://www.google.cz/search?q=hibernate%20discriminator%20value%20null)查找一些來源。否則我找不到官方文檔。 – xmedeko

2

好消息。我剛剛在新的用戶指南中記錄了這種行爲。這是JIRA問題。

基本上,你有兩個選擇:

  • @DiscriminatorValue("not null")作爲後備策略時沒有明確的鑑別值映射相匹配的基礎數據庫列值。
  • @DiscriminatorValue("null")用於數據庫列值爲空時。通常情況下,你會使用這個基類。

Hibernate blog as well上有詳細的例子。