के साथ हाइबरनेट डीएओ को कैसे कार्यान्वित करें मुझे जेनिक्स के साथ हाइबरनेट डीएओ बनाने के तरीके पर कुछ ट्यूटोरियल मिले हैं, लेकिन वे सभी के बजाय EntityManager
का उपयोग करते हैं। मेरा सवाल है कि SessionFactory
का उपयोग कर जेनेरिक के साथ डीएओ कैसे बनाया जाए। मैं अब तक नीचे है:जेनेरिक
इंटरफ़ेस:
public interface GenericDao<T> {
public void save(T obj);
public void update(T obj);
public void delete(T obj);
public T findById(long id);
}
कक्षा:
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
@Autowired
private SessionFactory sessionFactory;
public void save(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.save(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void update(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.update(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public void delete(T obj) {
Session session = sessionFactory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
session.delete(obj);
tx.commit();
} catch (HibernateException e) {
if(tx != null)
tx.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
public T findById(long id) {
// ??
return null;
}
मैं अनिश्चित कैसे findById
के बारे में जेनरिक का उपयोग कर जाने के लिए कर रहा हूँ। मेरा मानना है कि अन्य विधियां सही हैं, लेकिन अगर मैं गलत हूं तो मुझे सही करें।
साइड क्वेस्ट:EntityManager
SessionFactory
का उपयोग करने से अधिक फायदेमंद है? मैंने विषय पर कुछ पोस्ट देखी, लेकिन कुछ और राय चाहिए।
जावा में, जेनेरिक को मिटाकर कार्यान्वित किया जाता है और आपके औपचारिक प्रकार पैरामीटर 'टी' रन टाइम पर' ऑब्जेक्ट 'बन जाता है। दूसरे शब्दों में, रन टाइम प्रकार 'टी' पर मौजूद नहीं है। किसी भी जेनेरिक विधि जो एक नए खनन 'टी' आवृत्ति को वापस लाती है, इसलिए उसे रन टाइम टाइप टोकन की आवश्यकता होती है, जिसकी विधि उस उदाहरण के प्रकार को प्रतिबिंबित करने के लिए उपयोग कर सकती है जिसे इसे बनाने की आवश्यकता होगी। 'FindById (...)' के लिए एक और व्यावहारिक हस्ताक्षर इसलिए सार्वजनिक टी खोज है (कक्षा कक्षा, लंबी आईडी) '। –
scottb
@scottb तो कक्षा टोकन का उपयोग यह निर्धारित करने के लिए किया जाएगा कि किस प्रकार की ऑब्जेक्ट को वापस करने की आवश्यकता है? मैं इस बारे में बिल्कुल कैसे जाऊं?'EntityManager' उदाहरणों के साथ, मैंने' entityManager.find (type.class, id) देखा; 'लेकिन मुझे' सत्र फ़ैक्टरी 'के साथ ऐसा करने का तरीका नहीं है। –
यदि आपको जिस प्रकार की वापसी की आवश्यकता है, उसके पास कोई तर्क-तर्क कन्स्ट्रक्टर नहीं है, तो मनमानी प्रकार 'टी' के नए उदाहरण को गतिशील रूप से टकसाल करने का सबसे आसान तरीका 'कक्षा' की 'newInstance()' विधि का उपयोग करना होगा, जैसे। 'टी myObj = class.newInstance();'। अन्यथा, आपको तर्क के साथ उचित कन्स्ट्रक्टर का आह्वान करने के लिए 'कक्षा ' ऑब्जेक्ट के माध्यम से प्रतिबिंब का उपयोग करने की आवश्यकता हो सकती है। ऐसी विधि में, 'कक्षा कक्षा' में 'कक्षा' एक * रन टाइम प्रकार टोकन * की भूमिका निभाता है। जावा में, ये कभी-कभी जरूरी होते हैं क्योंकि जेनेरिक प्रकार रन टाइम पर मौजूद नहीं होते हैं। –
scottb