मेरे पास इकाई वर्ग नीचे हैं:

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Entity1 {

//other variables

@Id
@Column(name="ID")
private String id;

@OneToOne(fetch = FetchType.LAZY,
            cascade = CascadeType.ALL,
            mappedBy = "entity1")
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    private Entity2 entity2;

}
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class Entity2 {

//other variables

@Id
@Column(name = "ID", unique = true, nullable = false)
private String id;

@OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "ID")
    @MapsId
    @ToString.Exclude
    @EqualsAndHashCode.Exclude
    private Entity1 entity1;

}

मैं डेटाबेस को क्वेरी करने के लिए JpaSpecificationExecutor<T> इंटरफ़ेस से Page<T> findAll(@Nullable Specification<T> spec, Pageable pageable); का उपयोग कर रहा हूं।

अब मैं केवल Entity1 से जुड़ी तालिका से डेटा प्राप्त करना चाहता हूं न कि Entity2 से। लेकिन findAll() दोनों टेबलों से डेटा ला रहा है। इसके अलावा मैं @Query का उपयोग नहीं करना चाहता।

क्या कोई कृपया सुझाव दे सकता है कि मैं केवल Entity1 तालिका से डेटा लाने के लिए अपना कोड कैसे अपडेट कर सकता हूं, क्योंकि मुझे सेव() विधि का उपयोग करके दोनों तालिकाओं पर डेटा को स्टोर और अपडेट करने की आवश्यकता है।

मुझे बताएं कि क्या किसी और विवरण की आवश्यकता है।

0
MittulRazdan 6 जिंदा 2021, 17:15

1 उत्तर

सबसे बढ़िया उत्तर

आप का उपयोग करें द्विदिश @OneToOne एसोसिएशन। इसलिए, जैसा कि दस्तावेज़ीकरण में सुझाया गया है:

यद्यपि आप पैरेंट-साइड एसोसिएशन को आलसी रूप से प्राप्त करने के लिए एनोटेट कर सकते हैं, हाइबरनेट इस अनुरोध का सम्मान नहीं कर सकता क्योंकि यह नहीं जान सकता कि एसोसिएशन null है या नहीं।

यह पता लगाने का एकमात्र तरीका है कि चाइल्ड साइड पर कोई संबद्ध रिकॉर्ड है या नहीं, सेकेंडरी क्वेरी का उपयोग करके चाइल्ड एसोसिएशन को लाना है। चूंकि इससे N+1 क्वेरी समस्याएं हो सकती हैं, इसलिए @MapsId एनोटेशन के साथ यूनिडायरेक्शनल @OneToOne संबद्धता का उपयोग करना कहीं अधिक कुशल है।

हालाँकि, यदि आपको वास्तव में एक द्विदिश संघ का उपयोग करने की आवश्यकता है और यह सुनिश्चित करना चाहते हैं कि यह हमेशा आलसी होने वाला है, तो आपको आलसी राज्य आरंभीकरण बाइटकोड वृद्धि को सक्षम करने और @LazyToOne एनोटेशन का भी उपयोग करने की आवश्यकता है .

0
SternK 6 जिंदा 2021, 17:37
धन्यवाद, मुझे सुझाव के अनुसार @LazyToOne का उपयोग करने के लिए द्विदिश वन-वन मैपिंग रखने की आवश्यकता थी। मैंने इसे काम करने के लिए हाइबरनेट बाइटकोड एन्हांसमेंट का भी उपयोग किया। docs.jboss.org/hibernate/orm/ 5.2/सामयिक/html_single/बाइटकोड/…
 – 
MittulRazdan
7 जिंदा 2021, 12:32