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 {
...
}
私はそれを試みましたが、まだエラーが発生します。それはアイテムのセットをマッピングすることになると混乱するようです。マップされたエンティティを指定しようとしましたが、同じエラーメッセージが表示されました。 – emt14
私の更新された答えを参照してください – rhinds
ハム、基本的に抽象クラスといくつかの具体的な実装で独自のテーブルと1対多の関係を持つことはできません? – emt14