14

次のクラスがあるとします。

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@DiscriminatorColumn(name="animalType",discriminatorType=DiscriminatorType.STRING)
@QueryExclude
public abstract class Animal  {}

@Entity
@DiscriminatorValue("dog")
public class Dog {}

@Entity
@DiscriminatorValue("cat")
public class Cat {}

JPAリポジトリを構成することは何とか可能Animalですか?

私はもう試した

public interface AnimalRepository extends JpaRepository<Animal,Long>

ただし、これは次の場合に失敗します。

java.lang.IllegalArgumentException: 管理型ではありません: Animal

これを設定する方法はありますか?

次のようなタスクを実行できるようにしたいと考えています。

@Autowired
private AnimalRepository repository;

public void doSomething()
{
    Animal animal = repository.findById(123);
    animal.speak();
}
4

4 に答える 4

10

同様のエラーがありました。エンティティ クラスのマッピングを persistence.xml ファイルに追加することで解決しました。

したがって、次のようなものをpersistence.xmlに追加してください:

<persistence-unit>
...   
<class>yourpackage.Animal</class>
...
</persistence-unit>
于 2012-07-25T07:12:09.710 に答える
6

私はこの正確な問題を抱えていましたが、解決策を見つけました:両方を一緒に使用するのではなく、@MappedSuperclass OR を使用する必要があります。次のようにクラスに@Inheritance注釈を付けます。Animal

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Animal  {}

基礎となるデータベース スキームは同じままであり、ジェネリックが機能するAnimalRepositoryはずです。持続性プロバイダーはイントロスペクションを行い、実際のサブタイプに使用するテーブルを見つけます。

于 2013-01-15T19:42:02.457 に答える
2

永続化プロバイダーとして Hibernate を実行していると思いますよね? Hibernate メタモデルに対する型ルックアップが JPA で指定されているものと矛盾して正しく動作しないため、Hibernate を使用したこのシナリオの問題に遭遇しました (詳細については、このバグを参照してください)。したがって、ここには2つのオプションがあるようです:

  1. 抽象スーパークラス@Entityも同様に変更します
  2. 別の永続プロバイダーに切り替える
于 2012-03-29T17:31:45.440 に答える
0

webconfig の @EntityScan に Animal-class を含める必要があります

于 2016-04-22T11:12:19.067 に答える