2014-12-18 19 views
12

için Bahar Veri depo uygulamak için:Bir JPA <code>@MappedSuperClass</code> ve onu uzanan bir <code>@Entity</code> var nasıl bir @MappedSuperclass

@MappedSuperclass 
public class BaseClass { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column 
    private Boolean active; 

    //getters & setters 

} 

@Entity 
public class Worker extends BaseClass{ 

    @Column 
    private String name; 

    //getters & setters 

} 

taban sınıfın active alan çocukların varlıklar için bir bayraktır. Uygulamada sadece aktif olanlar yüklenmelidir.

public interface Dao<T extends BaseClass, E extends Serializable> extends 
     CrudRepository<T, E> { 

    Iterable<T> findByActive(Boolean active); 

} 

Ve bu düzgün önceki bir uzanan, Worker veri erişimi için olmalıdır arayüz: Sonra genel bir Spring Data Proxy interface yazdım benim mantık katmanında şimdi,

@Transactional 
public interface WorkerDao extends Dao<Worker, Long>{} 

Kuyusu Ben varlıkları üzerinde CRUD işlemleri için ortak kodu sarın bir soyut sınıf uyguladı. Her biri için bir hizmetim olacak, ama sadece abstract birinden miras almak istiyorum. Hizmetlerin her biri için belirli bir depoyu kablolamak ve bir abstract yöntemini kullanarak süper sınıfı sağlamak istiyorum. Bu benim üst sınıf uygulandığı açıklanmıştır:

public abstract class GenericService<E extends BaseClass>{ 

    public abstract Dao<E, Long> getDao(); 

    //Here I've got some common operations for managing 
    //all my application classes, including Worker 

} 

sorun getDao() yöntem BaseClass ve bir javax.persistence.Entity bir çocuk olmak garanti edilir E sınıf parametresi, kullanmasıdır.

Caused by: java.lang.IllegalArgumentException: Could not create query metamodel for method public abstract java.lang.Iterable com.mycompany.model.daos.interfaces.Dao.findByActive(java.lang.Boolean)! at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:93)

Caused by: java.lang.IllegalArgumentException: Not an entity: class com.mycompany.model.BaseClass at org.hibernate.jpa.internal.metamodel.MetamodelImpl.entity(MetamodelImpl.java:203)

EBaseClass bir çocuk olarak tanımlanır çünkü, mantıklı: Ben özel servis uygulamasından DAO erişmeye çalıştığınızda bu hatayı alıyorum.

public abstract class GenericService<E extends BaseClass && Entity> 

Ancak Worker sınıf E için imzası ile uyumlu değildir diyor çocuk Hizmet şu hata mesajı: derleyici benim de yazmasına olanak tanır. Bunu nasıl çözeceğini bilen var mı?

@NoRepositoryBean 
public interface Dao<T extends BaseClass, E extends Serializable> extends 
     CrudRepository<T, E> { 

    Iterable<T> findByActive(Boolean active); 

} 

Bu şekilde Bahar findByActive yöntemi uygulamak için altta yatan depo uygulamasına dayanır:

+0

* Bir AnaSınıf olmak * Hayır, tip olması gerektiğini bu somut yöneticisi belirtir, 'işçi'. – cy3er

+0

@ cy3er doğru. BaseClass'ın bir çocuğu olduğu garanti edilir. Ancak, JPA bir '@ Entity 'arar ve' BaseClass' bir 'MappedSuperclass' dir. –

+0

[Benzer soru] (http: // stackoverflow.com/questions/21415551/jenerik-spring-data-jpa-repository-application-to-load-data-by-class-type) sorunumu çözdü. Soyut depoyu “NoRepositoryBean” olarak eklemesi meselesiydi. Bu [post] (http://stackoverflow.com/a/11012490/1199132) sorduğum şeyi çözer, ek açıklama sınırlı bir tür mümkün değildir. –

cevap

İlgili konular