2010-01-12 123 views
0

作爲一個新的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> 

是一個很好的解決它最初描述的原始問題。 但是,我發現的是,具有對象層次結構和使用超類方法對於此解決方案不起作用,在這種情況下,註釋似乎是更好的選擇。

回答

1

我想做什麼就能做的是 如下:具有Hibernate的返回類型的 對象MyGeneratedClass 代替GeneratedClass讓我 可直接與子類的工作。 這樣可以在 中定義映射文件嗎?

是的,你只需要在映射中指定你的子類:<class name="Subclass" table="table">。然後你使用Subclass.class來查詢實體。

對於任何可能的解決方案,如果 GeneratedClass是一個類分層結構 (即GeneratedClassTypeA, GeneratedClassTypeB兩者延伸 GeneratedClass)的一部分,將這種模式仍然 工作?

是的。只要映射中定義的屬性存在於類中(因爲繼承),它就可以工作。

我想一個替代方案是 創建一個靜態工廠方法來 從 GeneratedClass創建MyGeneratedClass,但這似乎 低效大量 對象。

確實。

編輯

我不是從你生成的類出的映射你的問題的理解。我認爲它是從其他模型中產生的,它會吐出映射和類。您的評論澄清了這一點。然後我會嘗試使用hibernate inheritance的方法:

<class name="GeneratedClass" abstract="true"> 
    <id name="id" type="long" column="XXX"> 
     <generator class="sequence"/> 
    </id> 
    <property name="zzzz" column="ZZZZ"/> 
    ... 
    <union-subclass name="SubClass" table="TABLE"> 
    </union-subclass> 
</class> 

我沒有測試上面的代碼片段,但我相當確信,你的情況可以映射的一種方式或其他。 abstract=true可能是多餘的,但它顯示了父級超類不應該實例化的事實。該子類沒有附加屬性,所以subclass標籤爲空。

EDIT 2

你也<meta attribute="generated-class">CountryBase</meta>嘗試一下呢?從來沒有使用過它,但它似乎符合這個目的。參見Hibernate Class Generation with hbm2java

+0

「使用基類」,在實施例的以上的上下文只是爲了澄清,我會放<類名=「MyGeneratedClass> <! - ID映射,值屬性 - > 並且GeneratedClass本身沒有映射嗎? 但是如果我從這個映射生成Java類,是不是會覆蓋我寫的任何自定義代碼? – slau 2010-01-13 06:33:49

+0

感謝您的代碼片段。我發現當我插入它時到我現有的域對象層次結構中,union-subclass改變了數據庫模式,因爲我最初使用的是join-subclass(對不起,我沒有早點指出過) - 所以這對我來說是一個很好的解決方案。我正在添加的課程是不是層次結構的一部分,但是當使用hbm2java時,它仍然有覆蓋類的趨勢。我搜索hbm2java控制參數沒有成功;我想我正在考慮像EMF那樣註釋代碼以防止覆蓋的能力。 – slau 2010-01-19 17:50:59

+0

另外,您不能使用Hibernate 3和註釋來將映射和代碼保持在一起嗎?我發現配置文件非常方便。你是否也從映射中生成數據庫模式? – ewernli 2010-01-19 18:52:05