我有一個經典的休眠@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.這是一個遺留代碼,所以我不能更改模型。
確實很好的問題!恐怕你堅持SQL CASE解決方案。像'@ DiscriminatorColumn'或'@ DiscriminatorFormula'註解那樣的'forceDefault = true'選項(映射到根類而不是異常)將是很好的選擇。在你的工作代碼中還是缺少root類中的@ DiscriminatorValue?如果不是,也許你可以用這種方式強制默認映射。現在無法嘗試,但我懷疑它,如果使用了@ DiscriminatorColumn,則會爲缺少的@ DiscriminatorValue生成默認值。 – tscho
'@ DiscriminatorValue'在代碼和示例中都已丟失。這個細節讓我深入瞭解了Hibernate代碼並找到了解決方案。見下圖。 – xmedeko