मुझे पता है कि सर्वोत्तम अभ्यास में सेवा और दाओ परत दोनों हैं और सेवा स्तर पर @ ट्रान्सैक्शनल एनोटेशन जोड़ने के लिए। लेकिन मेरे मामले में इसका मतलब है कि मेरी अधिकांश सेवा कक्षाएं डीएओ विधियों को दोहराने के लिए बनाई गई हैं ... यह काफी परेशान है।सेवा कक्षाओं में दोहराने वाले डीएओ तरीकों से कैसे बचें? @ ट्रांसेक्शनल एनोटेटेड डीएओ और सर्विस क्लासेस - क्या यह स्वीकार्य अभ्यास है?
उदाहरण के लिए।
public interface FooDAO {
public List<FooVO> list(int cathegoryId);
public List<FooVO> list(int cathegoryId, int ownerId);
}
@Service
@Transactional
public class FooService {
protected @Autowired FooDAO dao;
public List<FooVO> list(int cathegoryId) {
dao.list(cathegoryId);
}
public List<FooVO> list(int cathegoryId, int authorId) {
dao.list(cathegoryId, authorId)
}
}
वह कितना मूर्ख है?
ज्यादातर मामलों में मुझे वास्तव में फैंसी सेवा विधियों की आवश्यकता नहीं होती है क्योंकि आमतौर पर यह प्राप्त करने का मामला है। एक कैथोरी विवरण और कैथीगरी से मेल खाने वाली इकाइयों की एक सूची। यही कारण है कि मैं एक सरल समाधान की तलाश में हूं। डीएओ को दोहराने से बचने के लिए जेनेरिक का उपयोग करने के रूप में शानदार: डी http://www.javablog.fr/javahibernate-dont-repeat-the-dao-with-a-genericdao.html
मैंने उत्तर की खोज की है। दूसरों के बीच में मैंने Where does the @Transactional annotation belong? पढ़ा है लेकिन अभी भी मेरा जवाब नहीं मिला है।
तो मुझे आश्चर्य है कि @ ट्रांसेक्शनल के साथ डीएओ विधियों को एनोटेट करना वास्तव में इतना बुरा विचार है। http://www.baeldung.com/2011/12/26/transaction-configuration-with-jpa-and-spring-3-1/#apistrategy से प्रेरित मैंने एक समाधान निकाला।
क्या होगा यदि:
- मैं केवल एक सेवा वर्ग है (जो वास्तव में जरूरत है) और अन्य सभी (सरल) के मामलों के लिए @Transactional
- के साथ अपने तरीकों पर टिप्पणी: मैं @Transactional साथ डीएओ तरीकों पर टिप्पणी (प्रचार = Propagation.MANDATORY) और @Transactional के साथ मेरी नियंत्रक तरीकों (प्रचार = Propagation.REQUIRES_NEW)
** अद्यतन 1 **
वह कुछ इस तरह दिखेगा:
public interface FooDAO {
@Transactional(propagation = Propagation.MANDATORY, readOnly=true)
public List<FooVO> list(int cathegoryId);
...
}
@Service
public class FooService {
protected @Autowired FooDAO dao;
@Transactional // propagation REQUIRED
public List<FooVO> magic(FooVO fooVO) {
//do sth complicated here ;)
}
// We do not repeat DAO methods in the Service class.
// No wrapping methods here !!!
}
@Controller
public class FooMagicController {
protected @Autowired FooService fooService;
...
fooService.magic(fooVO);
...
}
@Controller
public class FooController {
protected @Autowired FooDAO dao; //DAO wired directly in the Controller class !!!
@Transactional(propagation = Propagation.REQUIRES_NEW)
@RequestMapping(".....")
public String listFoo(Model model,...) throws Exception {
model.addAttribute("list", dao.list(13));
return "xyz";
}
}
प्रत्येक मामले डीएओ सत्र जो प्रबंधित किया जाता है "ऊपर" का उपयोग करता है।
क्या यह बहुत बुरा विचार है? क्या मुझे प्राप्त करने के लिए कोई बेहतर तरीका है?
मुझे इसी तरह का प्रश्न मिला है: http://stackoverflow.com/questions/4462785/transactional-controller-vs- सेवा "हां, आपके नियंत्रक विधियों में @ ट्रांसेक्शनल जोड़ना पूरी तरह मान्य है।" लेकिन "नियंत्रक को दृढ़ता परत के बारे में पता नहीं होना चाहिए, और आपको अपने व्यावसायिक तर्क को डेस्कटॉप एप्लिकेशन में पुन: उपयोग करना पड़ सकता है जहां आपकी नियंत्रक परत मौजूद नहीं है .." –