2012-02-07 7 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を追跡します。

代わりに、単純なListであることの、それは実際にキーが(スーパークラスから)Long idあるMapだように、私たちは、childrenListへの変更をしたいと思います。

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

はどのようにHibernateで取り扱わこの種の移行/種類の変化がありますか?私は、Hibernateのこの側面に慣れていないよ - (古いデータを使用して、アプリケーションの最初の負荷に)List<Shape>を受け入れ、新しいMapの手動生成を実行するためにオーバーロードすることができますいくつかの方法がありますか?

答えて

2

データベースに違いはありません。リストではなくマップを使用してシェイプを保存するだけですが、シェイプエンティティの属性はそのままで、シェイプを格納するテーブルには同じ列。

+0

のは、私はしばらくの間、元のデータモデルを使用してきたとしましょう、と私は10人の子供を持つ形状を有しています。データモデルを変更してアプリケーションを再起動すると、マップにはどのようなものが含まれますか?鍵は何になるでしょうか? –

+0

マップを使用する場合、@MapKeyを使用して、マップのキーとしてターゲットエンティティ(Shape)の属性の1つを使用する必要があります。デフォルトでは、キーはターゲットエンティティのIDです。したがって、マップには、IDのインデックスが付けられたリストのすべての要素が含まれます。スキーマ変更が必要な場合は、優先SQLツールを使用してデータを移行し、新しいマッピングでアプリケーションを起動します。しかし、この場合、それは必要ではありません。 –

+0

ありがとうございます - Hibernateには、組み込みのマッピングツール/機能がありますか?アプリケーションの中で実行できることは何ですか?私たちのアプリはHibernateをデータストアとして使用し、複数のクライアントサイトで使用されています。各場所にアクセスして手動でSQLを移行する必要があるのは面倒です。 (より複雑な移行の場合は) –

関連する問題