मेरे समस्या यह है कि हाइबरनेट OneToOne संघ के उत्सुक लोड हो रहा है पर अमल +1 प्रत्येक अशक्त संबंध के लिए चयन है।हाइबरनेट OneToOne (वैकल्पिक = true) FetchMode.JOIN साथ पुन: चुनें करने के लिए अशक्त कोशिश महत्व देता
इकाई उदाहरण:
@Entity
class SideBlue {
@Column(nullable = false)
private Integer timestamp;
@OneToOne(optional=true)
@JoinColumn(name="timestamp", referenceColumn="timestamp", insertable = false, updatable = false)
SideRed redSide;
}
@Entity
class SideRed {
@Column(nullable = false)
private Integer timestamp;
}
(यह एक विरासत डेटाबेस स्कीमा है, तो डेटाबेस संशोधनों अनुमति नहीं है)
क्वेरी उदाहरण:
CriteriaBuilder builder... CriteriaQuery query...
Root<SideBlue> root = query.from(SideBlue.class);
root.fetch(SideBlue_.sideRed, JoinType.LEFT);
entityManager().createQuery(query).getResultList();
परिणाम: यदि सब नीले पक्ष संस्थाओं एक लाल ओर सब कुछ सही ढंग से चला जाता है है,, इसलिए केवल डेटाबेस जो भी के लिए संस्थाओं को पुनः प्राप्त हो जाएगा करने के लिए एक क्वेरी निष्पादित हाइबरनेट।
लेकिन, अगर नीले पक्ष संस्थाओं जुड़े कोई लाल पक्ष इकाई है, दूसरी तरफ एक बार और पता लगाने की कोशिश हाइबरनेट। हाइबरनेट एसक्यूएल टिप्पणी कहती है '/ * लोड लालसाइड */चुनें ...' प्रत्येक शून्य लालसा संपत्ति के लिए।
मैं कैसे छोड़ इस दूसरे का चयन कर सकते हैं?
व्यावहारिक समस्या प्रकट होता है जब विलंबता बेहद कम नहीं है। यदि मैं 1 मिलियन पंक्तियों का चयन करने की कोशिश करता हूं, और 1/3 में शून्य 'लाल पक्ष' हैं, तो कुल विलंबता एक वास्तविक समस्या है।
संपादित करें:
इस क्वेरी
10:04:32.812 [main] DEBUG org.hibernate.loader.Loader - Result set row: 0
10:04:32.815 [main] DEBUG org.hibernate.loader.Loader - Result row: EntityKey[SideBlue#1269721], EntityKey[SideRed#3620564]
10:04:32.833 [main] DEBUG org.hibernate.loader.Loader - Result set row: 1
10:04:32.833 [main] DEBUG org.hibernate.loader.Loader - Result row: EntityKey[SideBlue#1269776], null
पहली पंक्ति नीले और लाल पक्षों शामिल है, लेकिन दूसरा एक ही नीले पक्ष के लिए डीबग लॉग है। तो हाइबरनेट को पता होना चाहिए कि संबंधित लाल पक्ष मौजूद नहीं है। लेकिन, के बाद सभी परिणाम पंक्तियां संसाधित कर रहे हैं ...
10:04:33.083 [main] DEBUG o.h.engine.internal.TwoPhaseLoad - Resolving associations for [BlueSide#1269721]
10:04:33.084 [main] DEBUG org.hibernate.loader.Loader - Loading entity: [RedSide#component[timestamp]{timestamp=1338937390}]
10:04:33.084 [main] DEBUG org.hibernate.SQL - /* load RedSide */ select ...
! Nothing really loaded because the previous SQL return empty result set, again !
10:04:33.211 [main] DEBUG org.hibernate.loader.Loader - Done entity load
आपका उदाहरण उलझन में है, जिस पक्ष में @JoinColumn एनोटेशन है, उस संबंध के संबंध में परिभाषा के मालिक है। – Affe
मेरी गलती। मैं इकाई परिभाषा को फिर से परिभाषित/सुधारता हूं। यह मेरी इकाई का सरलीकृत संस्करण है, लेकिन मुझे लगता है कि यह पर्याप्त है। डेटाबेस दोनों पक्षों के बीच कोई एफके नहीं है। –