作爲一個新的Hibernate用戶,我聽說向生成的類中添加一些輔助方法的好方法是將它們添加到子類中。例如:映射休眠「自定義」子類
// generated via Hibernate mapping file
public class GeneratedClass {
long id;
String someValue;
// etc, etc.
}
// my own class with pretty printing method
public class MyGeneratedClass extends GeneratedClass {
public String prettyPrint() {
return "an object: " + id + "," + someValue;
}
}
我想做什麼就能做的是以下幾點:類型MyGeneratedClass代替GeneratedClass都Hibernate的回報對象,這樣我可以與子類直接工作。映射文件是否可以用這種方式定義(即不用覆蓋任何自定義代碼)?
對於任何可能的解決方案,如果GeneratedClass是類層次結構(即擴展GeneratedClass的GeneratedClassTypeA,GeneratedClassTypeB)的一部分,該模式是否仍然有效?
我想一個替代方案是創建一個靜態工廠方法從GeneratedClass創建MyGeneratedClass,但這對於大量對象來說似乎效率低下。
在此先感謝!
編輯
試圖脫離聯邦級的策略之後,我意識到它沒有我的情況下工作,因爲現有的類層次結構和數據。此外,我無法控制覆蓋我的子類的一代(hbm2java中的一個理想功能?)。最後,我確實考慮過將代碼嵌入到映射文件中,但是重寫getter和setter等東西看起來很乏味。
我回顧了方法,決定去註釋域對象並避免完全使用hbm2java。這並不完全理想(映射似乎更容易處理),但是從我從各種來源收集的信息來看,它可能是處理我特殊情況的最合適的方式,因爲它使我可以自由地使用類型檢查來自定義代碼並只處理類文件。
我希望對我的解決方案有任何其他想法或意見。
編輯2
該溶液下文提議,使用
<meta attribute="generated-class">CountryBase</meta>
是一個很好的解決它最初描述的原始問題。 但是,我發現的是,具有對象層次結構和使用超類方法對於此解決方案不起作用,在這種情況下,註釋似乎是更好的選擇。
「使用基類」,在實施例的以上的上下文只是爲了澄清,我會放<類名=「MyGeneratedClass> <! - ID映射,值屬性 - > 並且GeneratedClass本身沒有映射嗎? 但是如果我從這個映射生成Java類,是不是會覆蓋我寫的任何自定義代碼? – slau 2010-01-13 06:33:49
感謝您的代碼片段。我發現當我插入它時到我現有的域對象層次結構中,union-subclass改變了數據庫模式,因爲我最初使用的是join-subclass(對不起,我沒有早點指出過) - 所以這對我來說是一個很好的解決方案。我正在添加的課程是不是層次結構的一部分,但是當使用hbm2java時,它仍然有覆蓋類的趨勢。我搜索hbm2java控制參數沒有成功;我想我正在考慮像EMF那樣註釋代碼以防止覆蓋的能力。 – slau 2010-01-19 17:50:59
另外,您不能使用Hibernate 3和註釋來將映射和代碼保持在一起嗎?我發現配置文件非常方便。你是否也從映射中生成數據庫模式? – ewernli 2010-01-19 18:52:05