1

この質問のフォローアップとして質問しています。私はまったく同じことをしていますが、機能しません。つまり、抽象クラスをインスタンス化しようとしていることを示す例外が引き続き発生します。

org.springframework.orm.jpa.JpaSystemException: org.hibernate.InstantiationException: 抽象クラスまたはインターフェースをインスタンス化できません

唯一の違いは、自分のクラスを Serializable インターフェースを実装するように設定していないことですが、おそらくそれが理由ではないと考えたので、Spring と Hibernate のバージョンを疑っています。

したがって、基本的に抽象クラスは次のようになります。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name="activities")
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING)
public abstract class Activity
{
    @Id
    @Column(length=Fields.ID_FIELD_SIZE)
    protected String id;
    ....

および 2 つのサブクラス

@Entity
@Table(name="a_activities")
@DiscriminatorValue("A")
public class AActivity extends Activity
{
...

@Entity
@Table(name="b_activities")
@DiscriminatorValue("B")
public class BActivity extends Activity
{
...

ActivityRepository を使用して ID でアクティビティを取得すると、前述の例外が発生します。

@Qualifier("activity-repository")
public interface ActivityRepository extends JpaRepository<Activity, String>
{
}

Spring Data 1.2.0 と Hibernate 4.1.7 を使用しています。

別の質問として申し訳ありませんが、元の質問にはコメントできませんでした

4

1 に答える 1

2

私はこの問題を解決することができました。これが起こった主な理由は、この階層が既存のシステムに導入されたことです。つまり、この変更の前にデータベースにデータがあったことを意味します。Activity クラスは以前は具象クラスであり、サブクラスのテーブルは存在しませんでした。この階層を追加するときに、サブクラスのテーブルを作成しました。ただし、インスタンス化するサブクラスの適切なテーブルに各 Activity オブジェクトのエントリを挿入する必要があることを見逃していました。

1 つのエントリでこれを試したところ、ID でそのアクティビティを正常に取得できました。したがって、スクリプトを実行して、既存のすべてのアクティビティ エントリのサブクラス エントリを適切なテーブルに適切に挿入する必要があります。

この回答はすでにこの点を指摘していることがわかりましたが、どういうわけか私は Discriminator 値のチェックに注意しましたが、各エントリが対応するサブクラス テーブルに行があることを確認する必要がありませんでした。

于 2013-05-22T07:04:27.520 に答える