से प्राप्त कर सकता हूं, मैं एक रिपोजिटरी क्लास बनाने की कोशिश कर रहा हूं जिसे मैं मूल सीआरयूडी कार्यक्षमता प्राप्त करने के लिए प्राप्त कर सकता हूं। EntityManager.find (..) को कक्षा तर्क की आवश्यकता है। हालांकि, आप इसे T
पास नहीं कर सकते (किसी कारण से मुझे अभी तक समझ में नहीं आता है ... टाइप मिटाएं)। इसलिए मुझे वह विधि मिली जो इकाई वर्ग लौटाती है और मैंने इसे देखा एक और प्रश्न से जोड़ा। सबसे पहले, यह कैसे काम करता है और दूसरा प्रदर्शन पर इसका अधिक असर होगा? मैं इसे प्रतिबिंब का उपयोग करता हूं।जेपीए के लिए एक सामान्य डीएओ बनाना जो मैं
@Stateless
public abstract class AbstractSqlRepository<T> implements Repository<T> {
@PersistenceContext
private EntityManager entityManager;
@Override
public void create(T entity) {
entityManager.persist(entity);
}
@Override
public T find(int id) {
return entityManager.find(getEntityClass(), id);
}
@Override
public T update(T entity) {
return entityManager.merge(entity);
}
@Override
public void remove(T entity) {
entityManager.remove(entity);
}
public EntityManager getEntityManager() {
return entityManager;
}
public Class<T> getEntityClass() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<T>) genericSuperclass.getActualTypeArguments()[0];
}
}
नए दृष्टिकोण:
@Stateless
public abstract class AbstractSqlRepository<T> implements Repository<T> {
@PersistenceContext
private EntityManager entityManager;
private Class<T> clazz;
public AbstractSqlRepository(Class<T> clazz) {
this.clazz = clazz;
}
@Override
public void create(T entity) {
entityManager.persist(entity);
}
@Override
public T find(int id) {
return entityManager.find(clazz, id);
}
@Override
public T update(T entity) {
return entityManager.merge(entity);
}
@Override
public void remove(T entity) {
entityManager.remove(entity);
}
public EntityManager getEntityManager() {
return entityManager;
}
}
और
सार्वजनिक वर्ग QuestionSqlRepository फैली AbstractSqlRepository लागू करता QuestionRepository {
public QuestionSqlRepository() {
super(Question.class);
}
}
क्या यह एक बुरा दृष्टिकोण है?
प्रतिबिंब के प्रदर्शन पर असर पड़ेगा। आपको यह देखने की कोशिश करनी होगी कि क्या यह आपके प्रोजेक्ट को बहुत अधिक प्रभावित करता है। अच्छा विचार हालांकि! – RNJ
उतना ही सुरुचिपूर्ण नहीं है कि आप हमेशा कक्षा क्लास टाइप ऑब्जेक्ट को कन्स्ट्रक्टर में सेट कर सकते हैं। उप-वर्ग निर्माता को केवल सुपर (this.getClass()) को कॉल करने की आवश्यकता होगी। यह प्रतिबिंब का उपयोग करने से तेज होगा, लेकिन विकास में एक अतिरिक्त कदम है। –
JustinKSU