0

以下に示す単一のテーブル階層があります。

@MappedSuperclass
@Table(name = "v_contract_account", schema = "SAP")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@XmlRootElement
@XmlSeeAlso({CurrencyAccount.class, ProgramAccount.class})
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class AbstractContractAccount implements Serializable {
    ....
}

@Entity
@Table(name = "v_contract_account", schema = "SAP")
@Immutable
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("0")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CurrencyAccount extends AbstractContractAccount  {
    ...
}

@Entity
@Table(name = "v_contract_account", schema = "SAP")
@Immutable
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
@DiscriminatorValue("1")
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ProgramAccount extends AbstractContractAccount {
    ...
}

現在はそのまま動作しますが (ディスクリミネータを除く)、サブクラスからテーブル アノテーションを削除すると、Hibernate が例外をスローするのはなぜですか?

org.jboss.resteasy.spi.UnhandledException: java.lang.ClassCastException: org.jboss.resteasy.specimpl.BuiltResponse cannot be cast to [Lcom.zanox.internal.billingmasterdata.domain.entity.CurrencyAccount;

そして奇妙なことに、抽象スーパークラスにテーブルと継承の注釈を入れなくても、すべてが正常に機能します。これは、MappedSuperClass がテーブルと継承の注釈を気にしないということですか? 注釈 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) がどこにも必要ない場合、どこで指定すればよいですか?

ところで、ここでの私の場合、Hibernate はテーブルを作成しません。テーブルは既に存在し、マップしたいだけです。

4

1 に答える 1

1

おそらく、親エンティティから @MappedSuperClass アノテーションを削除して、通常のエンティティにする必要があります。

http://docs.oracle.com/javaee/5/api/javax/persistence/MappedSuperclass.html

AbstractContractAccount に対してクエリを実行する場合は、Entity である必要があります。MappedSuperclass の場合、これを行うことはできません。

一般的なマッピングを定義したいが、実際の「データベース継承」がない場合は、 @MappedSuperClass を使用します。

http://en.wikibooks.org/wiki/Java_Persistence/Inheritance

マッピングされたスーパークラスの継承により、継承がデータ モデルに存在しない場合でも、オブジェクト モデルで継承を使用できます。クラス継承ごとのテーブルに似ていますが、クエリ、永続化、またはスーパークラスへの関係は許可されません。その主な目的は、そのサブクラスがマッピング情報を継承できるようにすることです。サブクラスは、テーブル、ID、およびその他の情報の定義を担当し、継承されたマッピングを変更できます。マップされたスーパークラスの一般的な使用法は、アプリケーションに共通の PersistentObject を定義して、ID やバージョンなどの共通の動作とマッピングを定義することです。マップされたスーパークラスは通常、抽象クラスにする必要があります。マップされたスーパークラスはエンティティではありませんが、代わりに @MappedSuperclass アノテーションまたは要素を介して定義されます。

于 2013-11-08T16:00:17.870 に答える