ฉันมักจะใช้Hibernateร่วมกับSpring framework และเป็นความสามารถในการแบ่งเขตธุรกรรมแบบเปิดเผย (เช่น@Transactional )
อย่างที่เราทุกคนทราบกันดีว่าไฮเบอร์เนตพยายามที่จะไม่รุกรานและโปร่งใสที่สุดเท่าที่จะเป็นไปได้อย่างไรก็ตามสิ่งนี้พิสูจน์ได้ว่าท้าทายกว่าเล็กน้อยเมื่อใช้lazy-loaded
ความสัมพันธ์
ฉันเห็นทางเลือกในการออกแบบจำนวนมากที่มีระดับความโปร่งใสแตกต่างกัน
- ทำให้ความสัมพันธ์ไม่ขี้เกียจโหลด (เช่น
fetchType=FetchType.EAGER)
- นี่มันม่วงทั้งไอเดียขี้เกียจโหลด ..
- เริ่มต้นคอลเลกชันโดยใช้
Hibernate.initialize(proxyObj);
- นี่หมายถึงการมีเพศสัมพันธ์ที่ค่อนข้างสูงกับ DAO
- แม้ว่าเราสามารถกำหนดอินเทอร์เฟซได้
initialize
แต่การใช้งานอื่น ๆ ก็ไม่รับประกันว่าจะให้สิ่งที่เทียบเท่า
- เพิ่มลักษณะการทำธุรกรรมให้กับ
Model
อ็อบเจ็กต์ถาวร(โดยใช้พร็อกซีแบบไดนามิกหรือ@Transactional
)- ฉันไม่ได้ลองใช้วิธีพร็อกซีแบบไดนามิกแม้ว่าฉันจะไม่เคยให้ @Transactional ทำงานกับวัตถุถาวรด้วยตัวเอง อาจเป็นเพราะการจำศีลนั้นกำลังดำเนินการกับพร็อกซีที่จะเข้ามา
- สูญเสียการควบคุมเมื่อมีการทำธุรกรรมเกิดขึ้นจริง
- ระบุทั้ง lazy / non-lazy API เช่น
loadData()
และloadDataWithDeps()
- บังคับให้แอปพลิเคชันรู้ว่าเมื่อใดควรใช้รูทีนใดการมีเพศสัมพันธ์ที่แน่นหนาอีกครั้ง
- วิธีล้น
loadDataWithA()
,, .... ,loadDataWithX()
- บังคับให้ค้นหาการอ้างอิงเช่นโดยจัดเตรียม
byId()
การดำเนิน การเท่านั้น- ต้องใช้กิจวัตรที่ไม่ใช่เชิงวัตถุจำนวนมากเช่น
findZzzById(zid)
แล้วgetYyyIds(zid)
แทนที่จะเป็นz.getY()
- การดึงแต่ละวัตถุในคอลเลกชันทีละรายการจะเป็นประโยชน์หากมีค่าใช้จ่ายในการประมวลผลระหว่างธุรกรรมจำนวนมาก
- ต้องใช้กิจวัตรที่ไม่ใช่เชิงวัตถุจำนวนมากเช่น
- สร้างส่วนหนึ่งของแอปพลิเคชัน @Transactional แทนDAOเท่านั้น
- ข้อควรพิจารณาที่เป็นไปได้ของธุรกรรมที่ซ้อนกัน
- ต้องใช้กิจวัตรที่ปรับให้เหมาะกับการจัดการธุรกรรม (เช่นเล็กน้อยพอเพียง)
- ผลกระทบทางโปรแกรมเล็กน้อยแม้ว่าอาจทำให้เกิดธุรกรรมจำนวนมาก
- จัดเตรียม DAO ด้วยโปรไฟล์การดึงข้อมูลแบบไดนามิกเช่น
loadData(id, fetchProfile);
- แอปพลิเคชันต้องรู้ว่าจะใช้โปรไฟล์ใดเมื่อใด
- ประเภทของธุรกรรม AoP เช่นสกัดกั้นการดำเนินการและทำธุรกรรมเมื่อจำเป็น
- ต้องมีการจัดการรหัสไบต์หรือการใช้พร็อกซี
- สูญเสียการควบคุมเมื่อมีการทำธุรกรรม
- มนต์ดำเช่นเคย :)
ฉันพลาดตัวเลือกใดไปหรือไม่?
ซึ่งเป็นแนวทางที่คุณต้องการเมื่อพยายามลดผลกระทบของ lazy-loaded
ความสัมพันธ์ในการออกแบบแอปพลิเคชันของคุณ
(โอ้และขอโทษสำหรับWoT )