2012-02-14 17 views
3

MapにはMyObjectのインスタンスが含まれています。Hibernateで<String、List <Object>>マップを永続化する方法

:私たちは、スタックトレースを受ける

private Map<String, List<MyObject>> results = new HashMap<String, List<MyObject>>(); 

しかし、起動時:

@OneToMany(cascade = CascadeType.ALL) 
@LazyCollection(LazyCollectionOption.FALSE) 
private Map<String, MyObject> results = new HashMap<String, MyObject>(); 

我々は Map Listにによって保存された 値を変更:MyObjectクラスは、そのフィールドを永続化するためにJPAを使用しています
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.me.myapp.MyObject.results[java.util.List] 
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1150) 
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:680) 
    at org.hibernate.cfg.annotations.MapBinder$1.secondPass(MapBinder.java:107) 
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1221) 
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:383) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1206) 
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:673) 
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334) 
    ... 30 more 

Hibernateは、以下を保持することをサポートしていません。Map (値として)Listタイプ?または、注釈が間違っていますか?私は、この特定の構成がドキュメントやサンプルのいずれにも見つかりませんでした。

+0

MyObjectはJPAマップクラスですか? –

+0

@ToddMurray:そうでなければ、OPは 'MyObject.results'フィールドが' @ OneToMany'としてどのように注釈付けされているかに関するエラーメッセージを受け取っていません。 – ruakh

+0

まあ、MyObjectのインスタンスは現在、Hibernateに保存されています。しかし、String-> MyObjectでマップを保存するのではなく、代わりにString-> Listにする必要があります。

答えて

1

個人的には、これはHibernateをうまく使っているとは思いません。ここにははありません。抽象化はここにあります。親のデータメンバとして子リストとして表現された1対多の関係を持つモデルオブジェクトがあれば意味があります。

私の意見は? Hibernateを使用しないでください。まっすぐなJDBC、SpringのJDBCテンプレート、またはiBatisのようなものを使用してください。

ORMは、 "オブジェクトリレーショナルマッピング"の略です。あなたはテーブルを持っているので、リレーショナル部分を持っています。表の列に割り当てることができるデータがあります。

しかし、あなたはオブジェクトがないように私に聞こえる。なぜHibernateを使うのですか?

+0

Hibernateに格納されている他の多くの関係があります。私たちは現在、2つのデータモデルの間を移行しています。そのため、Hibernateがデータベースをどのように構築するかを判断するために実験を行い、変更を反映するためにSQL /移行スクリプトに含める必要があります。これらのクラス/関係は最終的なものではありませんが、ヒントに感謝します。 :) –

+0

多分あなたは混在してマッチすることができます。あなたの永続性層は、必ずしも1つの技術である必要はありません。意味をなさないものを使う。 – duffymo

1

マップに格納されるオブジェクトは、oneToManyアソシエーションのターゲットオブジェクト(常にマップされている)でなければなりません。そこに任意のオブジェクトやコレクションを格納することはできません。

+0

主に他のクラスにListをカプセル化し、そのクラスをMapの値として格納することで、問題が他のコメント付きの提案の一部で緩和できるように聞こえます。 –

関連する問題