2012-11-01 148 views
0

我需要建立一個Vehicle域對象。所有車輛對象將有大約5個屬性...沒什麼大不了的。我用@Entity註釋了這個類,並用@Id標註了一個id。我的問題是,我需要考慮另外兩種特種車輛。一個需要保存2個額外的字符串值,另一個需要保存一個字符串列表。休眠ORM設計策略

我希望能夠做一個findAll()並獲得所有的車輛,所以我沒有真正賣給爲其他兩種類型的車輛創建完全獨立的域對象,併爲他們完全分開的表格。我玩弄了一個想法,創建一個「AdditionalProperties」抽象類,使其成爲Vehicle的成員,然後將其擴展到我的兩個專業車輛,但我很快就迷失在正確的方式來註釋它並將其映射到數據庫。但即使如此,我仍然堅持寫很多單片if語句來檢查車輛類型並且投射該類等等等

我的另一個想法是在單個Vehicle域對象中包含額外的字段,儘管它們對所有其他類型的車輛都沒有任何意義),並且將這些值保留爲零,除非它是專用車輛之一。

有沒有人有任何想法,我應該如何解決這個可能的一些例子如何應該註釋類?

回答

3

爲什麼不簡單地創建Vehicle的兩個子類,並且包含其他屬性? Hibernate支持繼承就好了。您可以有三種選擇堅持實體繼承樹:

  • 一切都在一個表(通常是最快和最簡單的選項)
  • 在自己的表中的每個實體
  • 在公共表公共屬性,以及他們自己表中的其他子實體屬性。

無論您選擇哪種解決方案,選擇車輛都會選擇符合標準的所有車輛。 Hibernate查詢是多態的。

閱讀the documentation

+0

我是否必須將Vehicle註釋爲@MappedSuperclass?這是否讓我實例化/堅持一個沒有擴展的Vehicle類?或者他們都註釋爲@Entity?我想我想要第一個選項,他們都在同一個表... – Bal

+0

號MappedSuperclass和實體是獨家。當你想將常見的持久性字段繼承到幾個不相關的實體時(如使用具有'lastModified'字段的BaseEntity類),就使用MappedSuperclass。在你的情況下,你有一個功能的繼承,並且必須使用實體。如果Vehicle類不是asbtract,那麼是的,除了子實體實例之外,您可以堅持使用Vehice實例。所有實體(包括Vehicle)都必須具有實體註釋。 –

+0

以下文檔中的示例完美無缺。我建立了一個返回類型Vehicle的工廠,但是根據傳入的類型,它創建了適當的具體類並將其返回。我使用Spring將AJAX返回給客戶端,即使我擁有一組車輛,它也會自動識別具體的實現類併爲每個類返回額外的值。非常感謝! – Bal