2012-03-26 6 views
9

JPAに具体的な実装を含む抽象的なコレクションを永続させることが可能な場合、私はうまくいっています。抽象コレクションをjpaにマップするにはどうすればよいですか?

これまでのところ私のコードは次のようになります。

@Entity 
public class Report extends Model { 

    @OneToMany(mappedBy = "report",fetch=FetchType.EAGER) 
    public Set<Item> items; 
} 

@MappedSuperclass 
public abstract class OpsItem extends Model { 

    @ManyToOne 
    public RetailOpsBranch report; 
} 


@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class BItem extends OpsItem { 
... 
} 

しかし、私は以下のマッピングエラーにつまずき続けると、これは実現可能であるならば、私は本当に知らないのですか?

JPA error 
A JPA error occurred (Unable to build EntityManagerFactory): Use of @OneToMany or 
@ManyToMany targeting an unmapped class: models.Report.items[models.OpsItem] 

UPDATE

私はこの問題は、抽象クラスが、@MappedSuperclassアノテーションではないと思います。 jpaは、1対多の関係を@MappedSuperClassとマッピングしたくないようです。 抽象クラスを具体的なクラスに変更すると、同じエラーが発生します。

@Entityアノテーションに変更すると、これは抽象クラスと具象クラスの両方で機能するようです。

これは、抽象クラスを@Entityにマップするのが少し奇妙なようです。 何か不足していますか?

rhindsからの助けを借りてそれを把握するためにマネージドソリューション

。 2つの注意点:

1)抽象クラスには、サブクラスが独自のテーブルを持つために、@Entityとクラスごとのテーブルの継承ストラテジが付いている必要があります。

2)IDの生成はこのシナリオでは機能しません。テーブル生成タイプを使用する必要がありました。

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class OpsItem extends GenericModel { 

    @Id 
    @GeneratedValue(strategy = GenerationType.TABLE) 
    public Long id; 

    public String   branchCode; 

    @ManyToOne 
    public Report report; 
} 

@Entity 
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

答えて

6

もちろん可能です。最上位抽象クラス(MappedSuperClass自体は永続化されません)にのみ実装し、実装クラスにEntityアノテーションを追加する必要があります。

このような何かにそれを変更してみてください:

@MappedSuperclass 
public abstract class OpsItem extends Model { 

    @ManyToOne 
    public RetailOpsBranch report; 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class AItem extends OpsItem { 
... 
} 

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public class BItem extends OpsItem { 
... 
} 

チェックの使用の詳細については、Hibernateのドキュメントのこのセクション:

申し訳http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e1168


UPDATE、完全にクラスごとのテーブルビットを見逃しました。 Hibernateは、クラスごとのテーブルの抽象オブジェクトのマッピングをサポートしていません(すべての実装が単一のSQLテーブル内にある場合のみListをマップでき、TABLE_PER_CLASSは "テーブルごとのクラス"戦略を使用します)。

制限事項と戦略ここでは:http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#inheritance-limitations

+0

私はそれを試みましたが、まだエラーが発生します。それはアイテムのセットをマッピングすることになると混乱するようです。マップされたエンティティを指定しようとしましたが、同じエラーメッセージが表示されました。 – emt14

+0

私の更新された答えを参照してください – rhinds

+0

ハム、基本的に抽象クラスといくつかの具体的な実装で独自のテーブルと1対多の関係を持つことはできません? – emt14

関連する問題