2012-02-16 6 views
4

私はJPA /休止状態を使用してデータベースに固執したい訪問可能要素のリストを管理クラスを持っている:JPA 2.0でサブタイプのリストを永続化するにはどうすればよいですか?

@Entity 
class Elements { 
    void accept(Visitor v) {...} 
    @? List<Visitable> elements; // or List<AbstractElement> 
} 

@? class AbstractElement implements Visitable {} 

@Entity class Element1 extends AbstractElement {} 
@Entity class Element2 extends AbstractElement {} 

class ElementDAO { 
    void saveElements(Elements e, EntityManager em) { 
    em.persist(e); 
    } 
} 

Iは、複数のアプローチを試みました。私はAbstractElementを@MappedSuperclassとしてマークしようとしましたが、Hibernateは正しいVisitable型を見つけられず、@OneToMany(targetEntity = AbstractElement.class)でマークすることはできません。 AbstractElementを含むようにListを変更しようとしましたが、Hibernateは抽象クラスをインスタンス化できないと不平を言っています。また、AbstractElementクラスでTABLE_PER_CLASS継承ストラテジーを使用して、同じ 'インスタンス化できません'というエラーを取得しようとしました。

この問題を解決するための方法はありますか?これはまったく実行可能ですか?

私はこのサイトでjpaと継承を扱う多くの同様の質問を検索しましたが、いずれの提案もうまくいきませんでした。

更新: これは、継承や抽象クラスのメソッドではなく、EntityManager :: persistの代わりにEntityManager :: merge()を使用しようとしていた)。私は、マージがエンティティのコピーを作成するという事実と関係していると信じています。

この新しい知識に照らして、マージは抽象クラスのコレクションでは機能しないことを認めなければなりませんか?または、休止状態で呼び出すことができるコピーコンストラクタを追加する方法がいくつかありますか?

答えて

2

ListのコンテンツタイプがEntityであることをJPA/Hibernateに伝える必要があります。したがって、ListはElementsとAbstractElementの間の関係を表します(@OneToMany )、スーパー要素をクラス階層の最上位要素(@Inheritance)としてマークする必要があります。

@Entity 
class Elements { 
    @OneToMany 
    List<AbstractElement> 
} 

@Entity 
@Inheritance 
class abstract AbstractElement implements Visitable {} 
+0

これまで(私が上で述べたように)これを試しましたが、私はもう一度やり直すべきだと考えました。これを行うと、InstantiationExceptionが発生します:スレッド "main"の例外javax.persistence.PersistenceException:org.hibernate.InstantiationException:抽象クラスまたはインタフェースをインスタンス化できません:Element at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java :1215) – thebamaman

+0

元の質問の新しい更新情報を参照してください。そうすれば、persist()を使用しても正しい答えが得られますが、merge()に問題があります。 – thebamaman

+0

'merge()'に問題がある場合、そのコードを投稿する必要があります。また、 '@ OneToMany'の' CascadeType'アノテーションを見れば、ここで助けになるかもしれません。 – CoSeeWolf

関連する問題