2012-02-07 28 views
2

我使用Hibernate來存儲一個數據模型,其中有一些簡單的領域:更改Hibernate實體中的字段類型?

@Entity 
public class Shape extends DomainObject { 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @CollectionOfElements() 
    private List<Shape> children; 

    @Column 
    private int numSides; 

    ... etc. ... 
} 

DomainObject超跟蹤的Long id的。

我們想做出改變的childrenList,這樣的而不是一個簡單的List,它實際上是一個Map其中關鍵是Long id(從超)。

@??? 
private Map<Long, Shape> children; 

在Hibernate中如何處理這種性質的遷移/類型變化?我對Hibernate的這個方面不太熟悉 - 是否有一些方法可以超載來接受List<Shape>(在應用程序的第一次加載時,使用舊數據)並執行手動生成新的Map

回答

2

數據庫中應該沒有任何區別:只選擇使用Map而不是List來存儲Shapes,但Shape實體的屬性保持相同,因此存儲形狀的表也具有相同的列。

+0

比方說,我一直在使用原始數據模型,並且我有一個包含10個子項的Shape。當我對數據模型進行更改並重新啓動應用程序時,Map將包含什麼?關鍵是什麼? – 2012-02-07 19:16:07

+0

使用Map時,必須使用@MapKey將目標實體(Shape)的某個屬性用作地圖的鍵。默認情況下,密鑰是目標實體的ID。因此,地圖將包含列表中的所有元素,並按其ID進行索引。如果您需要更改架構,請使用您首選的SQL工具遷移數據,然後使用新映射啓動您的應用程序。但在這種情況下,它不應該是必要的。 – 2012-02-07 19:19:14

+0

謝謝 - Hibernate是否有可用的內置映射工具/功能?一些可以在我們的應用程序內執行的東西?我們的應用程序使用Hibernate作爲數據存儲,並在多個客戶端網站上使用。必須訪問每個位置並執行手動SQL遷移將非常繁瑣。 (對於更復雜的遷移,就是這樣)。 – 2012-02-07 19:23:08