2013-01-11 7 views
7

次のクラス構造を考える:春データJPASpring Data JPAでMappedSuperClassのすべての子に汎用リポジトリを使用できますか?

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

@Entity 
public class Dog {} 

@Entity 
public class Cat {} 

を、それがあるAnimalの種類を知らなくても、実行時にAnimalを永続化するために、一般的なAnimalリポジトリを使用することは可能でしょうか?

は、私は、リポジトリあたりのエンティティを使用して、それを行うと、このようなinstanceofを使用してすることができます知っている:

if (thisAnimal instanceof Dog) 
    dogRepository.save(thisAnimal); 
else if (thisAnimal instanceof Cat) 
    catRepository.save(thisAnimal); 
} 

が、私はinstanceofを使用しての悪い習慣に頼る必要はありません。

私はこのような一般的なリポジトリ使ってみた:

public interface AnimalRepository extends JpaRepository<Animal, Long> {} 

をしかし、これは、この例外が発生:Not an managed type: class AnimalAnimalEntityではないので、私は推測しています。それはMappedSuperclassです。

最適なソリューションは何ですか?

BTW - Animalは、残りのクラスがpersistence.xmlにリストされているので、問題はありません。

答えて

4

実際には、マッピングに問題があります。 @MappedSuperclassまたは@Inheritanceのいずれかを使用します。どちらも一緒に意味をなさない。エンティティを次のように変更してください。

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

基本的なデータベーススキームは同じです。今、1つ、一般AnimalRepositoryが動作します。 Hibernateはイントロスペクションを行い、実際のサブタイプに使用するテーブルを見つけます。

+0

'Animal'は' persistence.xml'の永続性ユニットのクラスとしてリストされるべきですか?あなたの提案が変更されました。新しい例外が発生しました: 'Unable to build EntityManagerFactory'。 –

+0

@CFL_Jeff:典型的にはアノテーションのみに依存しているので、わかりません。 'Caused by'を含むどこかで完全なスタックトレースを公開できますか? –

+0

他にもこのような問題があるようです。私はあなたが手元に問題を解決するのを手伝ってくれたと信じています。私は新しい問題に取り組むつもりです。ありがとう! –

関連する問題