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)
E
BaseClass
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:
* Bir AnaSınıf olmak * Hayır, tip olması gerektiğini bu somut yöneticisi belirtir, 'işçi'. – cy3er
@ cy3er doğru. BaseClass'ın bir çocuğu olduğu garanti edilir. Ancak, JPA bir '@ Entity 'arar ve' BaseClass' bir 'MappedSuperclass' dir. –
[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. –