2013-01-11 8 views
7

die folgende Klassenstruktur Gegeben:Kann ich ein generisches Repository für alle untergeordneten Elemente einer MappedSuperClass mit Spring Data JPA verwenden?

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

@Entity 
public class Dog {} 

@Entity 
public class Cat {} 

Mit Spring Data JPA, ist es möglich, ein Animal zur Laufzeit, ohne zu wissen, welche Art von Animal es ist ein allgemeines Animal Repository zu verwenden, bestehen bleiben?

Ich weiß, ich kann es ein Repository-pro-Einheit mit und durch instanceof wie folgt aus:

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

aber ich will nicht zu verwenden instanceof der schlechten Praxis greifen.

Ich habe versucht, eine generische Repository wie folgt aus:

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

Aber dies führt zu dieser Ausnahme: Not an managed type: class Animal. Ich schätze, weil Animal kein Entity ist, ist es ein MappedSuperclass.

Was ist die beste Lösung?

BTW - Animal ist mit dem Rest meiner Klassen in persistence.xml aufgeführt, so dass das nicht das Problem ist.

Antwort

4

Eigentlich ist das Problem mit Ihrem Mapping. Sie verwenden entweder @MappedSuperclassoder@Inheritance. Beides zusammen macht keinen Sinn. Ändern Sie Ihre Entität in:

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

Keine Sorge, das zugrunde liegende Datenbankschema ist das gleiche. Jetzt wird eine allgemeine AnimalRepository funktionieren. Hibernate wird die Introspektion durchführen und herausfinden, welche Tabelle für einen tatsächlichen Untertyp verwendet werden soll.

+0

Sollte 'Animal' als Klasse in meiner Persistenzeinheit in' persistence.xml' aufgeführt sein? Ihre vorgeschlagene Änderung verursacht eine neue Ausnahme: "EntityManagerFactory kann nicht erstellt werden". –

+0

@CFL_Jeff: Normalerweise vertraue ich nur auf Anmerkungen, also bin ich mir nicht sicher. Können Sie einen vollständigen Stack-Trace irgendwo veröffentlichen, einschließlich 'Caused by'? –

+0

Es sieht so aus, als hätte ich noch andere Probleme. Ich glaube, Sie haben mir geholfen, das Problem zu lösen, und ich werde an den neuen Problemen arbeiten. Vielen Dank! –

Verwandte Themen