मैं वसंत, हाइबरनेट का उपयोग कर एक वेब अनुप्रयोग बना रहा हूं। मान लीजिए कि एकाधिक उपयोगकर्ता पंजीकरण करना चाहते हैं। मैं एक पंजीकरण बीन (प्रोटोटाइप या अनुरोध या सत्र स्कॉप्ड) बनाउंगा और इसे नियंत्रक में स्वचालित कर दूंगा।वसंत वेब अनुप्रयोग में नियंत्रकों, सेवा, रिपोजिटरी का दायरा?
अब मैं पंजीकरण सेवा ("@transactional" टिप्पणी के साथ एनोटेट) है, जिसकी controler में autowired है करने के लिए इस सेम गुजर रहा हूँ। यह सेवा डीएओ (यह डीएओ सेवा में autowired है) यदि करने के लिए registeration सेम वस्तु प्राप्त पारित करेंगे सेवाओं और डीएओ singelton would'nt अनुरोध एकाधिक उपयोगकर्ताओं के लिए ऊपर मिलाया जा रहे हैं?
यहाँ मैं क्या किया है है: मैं "अनुरोध" के रूप में सेवा और डीएओ की गुंजाइश पैदा की है। क्या यह सही दृष्टिकोण है? या सेवा और डीएओ सिंगलटन बनाने के लिए मैं और क्या कर सकता हूं?
अनुरोध के पीछे मेरा तर्क स्कॉप्ड: अनुरोध करने के लिए सेवा और डीएओ बनाने का कारण यह है कि यदि एकाधिक उपयोगकर्ता पंजीकरण सेवा.registerUser (बीन) कहते हैं; एक ही समय में नियंत्रक से और दायरा सिंगलटन है तो वहां कोई स्थिरता coz नहीं होगी, वहां एक वस्तु के तरीकों को विभिन्न इनपुट के साथ बुलाया जाता है।
मुझे पता है जहां मैं गलत हूँ।
registeration बीन
@Component(value="registerBean")
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request")
public class RegisterBean {
@NotNull
private String userName;
private String lastName;
@NotNull
private String firstName;
String email_address;
String password;
String confirmPassword;
String gender;
//getters and setters
}
नियंत्रक
package com.ClickToShop.controllers;
@Controller
@SessionAttributes("user_info")
public class LoginPageController {
RegisterBean registerBean;//used
RegisterationService registerationService;//used
@Autowired
@Qualifier("registerationService")
public void setRegisterationService(RegisterationService registerationService) {
this.registerationService = registerationService;
}
@Autowired
@Qualifier("registerBean")
public void setRegisterBean(RegisterBean registerBean) {
this.registerBean = registerBean;
}
@ModelAttribute(value = "registerBean")
RegisterBean returnModelAttribute() {
return registerBean;
}
@RequestMapping(value = "/login-page.html")
public String showLoginPage() {
System.out.println("Showing login page");
System.out.println(registerBean);
return "login-page";
}
@RequestMapping(value = "/newuser-register", method = RequestMethod.POST)
public String registernewuser(@ModelAttribute("registerBean") @Valid RegisterBean bean, BindingResult result,final RedirectAttributes redirectAttr)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
//some validation code
registerationService.registerUser(bean);
return "redirect:successRegisteration";
}
}
}
Service Layer
@Service("registerationService")
@Transactional
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value="request")
public class UserServiceImpl implements RegisterationService {
private User_Details_Pojo userToRegisterPojo;
private AbstractHibernateDAO UserDAO;
@Autowired
public void setUserDAO(AbstractHibernateDAO userDAO) {
UserDAO = userDAO;
}
@Autowired
@Qualifier("userToRegisterPojo")
public void setUserToRegisterPojo(User_Details_Pojo userToRegisterPojo) {
this.userToRegisterPojo = userToRegisterPojo;
}
//main implementation code starts here
@Override
public void registerUser(Object userBean) {
RegisterBean bean=(RegisterBean) userBean;
//bean or model is converted to pojo
UserDAO.save(userToRegisterPojo);//calling DAO with specified pojo
}
}
डीएओ:
public abstract class AbstractHibernateDAO<T extends Serializable> {
public Class<T> clazz;//class object reference
protected SessionFactory mysessionFactory;
@Autowired
public void setMysessionFactory(SessionFactory mysessionFactory) {
this.mysessionFactory = mysessionFactory;
}
public T findOneByName(final String name){
return (T) getCurrentSession().createQuery("from "+clazz.getName()).uniqueResult();
}
public void setClazz(final Class<T> clazzToSet) {
this.clazz = clazzToSet;
}
public T findOne(final Long id) {
return (T) getCurrentSession().get(clazz, id);
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
return getCurrentSession().createQuery("from " + clazz.getName()).list();
}
public void save(final T entity) {
getCurrentSession().merge(entity);
}
public void update(final T entity) {
getCurrentSession().update(entity);
}
public void delete(final T entity) {
getCurrentSession().delete(entity);
}
public void deleteById(final Long entityId) {
final T entity = findOne(entityId);
delete(entity);
}
protected Session getCurrentSession() {
return mysessionFactory.getCurrentSession();
}
}
कंक्रीट डीएओ
@Repository
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS,value="request")
public class UserDAO extends AbstractHibernateDAO<User_Details_Pojo>{
}
मान लीजिए कि एकाधिक उपयोगकर्ता पंजीकरण करना चाहते हैं। मैं प्रत्येक उपयोगकर्ता के लिए पंजीकरण बीन (प्रोटोटाइप, अनुरोध, सत्र स्कॉप्ड) तैयार करूंगा.अब मैं पंजीकरण सेवा में इस बीन को पास कर रहा हूं ("@transactional" एनोटेशन के साथ एनोटेटेड)। यह सेवा प्राप्त हो जाएगी डीएओ को पंजीकरण बीन ऑब्जेक्ट। अगर सेवा और डीएओ सिंगलटन हैं तो एकाधिक उपयोगकर्ताओं के लिए अनुरोधों को मिश्रित नहीं किया जाएगा? – beinghuman
यह तब तक नहीं होना चाहिए जब तक आप डीएओ में हाइबरनेट सत्रों को प्रबंधित करने की कोशिश नहीं कर रहे हों। वसंत प्रति लेनदेन, हाइबरनेट सत्र सहित एक लेनदेन संदर्भ आवंटित करेगा। वेब सर्वर प्रत्येक उपयोगकर्ता के अनुरोध के अनुसार पूल से थ्रेड आवंटित/थ्रेड आवंटित करेगा। इसलिए दो उपयोगकर्ताओं के पंजीकरण सेम अलग-अलग मेमोरी स्थानों में "लाइव" होंगे और अलग-अलग हाइबरनेट सत्रों के माध्यम से संसाधित किए जाएंगे, और अलग-अलग डीबी कनेक्शन पर अलग-अलग लेन-देन में डेटाबेस में लिखे जाएंगे। – Olaf
यह स्पष्ट हो जाएगा कि क्या आप मुझे यह समझा सकते हैं। कई अनुरोध आते हैं। वेब सर्वर प्रत्येक अनुरोध के लिए अलग थ्रेड आवंटित करता है। ये थ्रेड समान सिंगलटन नियंत्रक का उपयोग करता है जिसमें प्रोटोटाइप रजिस्टरबीन होता है? प्रत्येक थ्रेड को अलग मॉडल बीन कोज़ कैसे मिलेगा मैंने देखा है यदि सिंगलटन नियंत्रक प्रोटोटाइप बीन का उपयोग करता है तो इस सिंगलटन नियंत्रक के प्रारंभ के दौरान इसके आश्रित प्रोटोटाइप बीन भी बनाए जाएंगे। इसलिए सभी अनुरोध एकल बीन तक पहुंच जाएंगे। कृपया मुझे प्रबुद्ध करें। – beinghuman