मैं निम्नलिखित इकाई (केवल प्रासंगिक मैपिंग दिखाया गया है) है:जेपीए/हाइबरनेट: @ManyToOne और @OneToOne रिश्ते FetchType.LAZY के रूप में टैग किए गए हैं और वैकल्पिक = झूठी em.find() पर आलसी लोड नहीं हो रहा है?
@Entity
@Table(name = "PQs")
public class PQ implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Integer id;
@Column
private String name;
@ManyToOne(fetch = FetchType.LAZY) // lazy XToOne
@JoinColumn(name = "user_id", referencedColumnName = "person_id")
private User user;
@OneToOne(mappedBy = "pq", fetch = FetchType.LAZY) // lazy XToOne
private Group group;
@OneToOne(mappedBy = "pq", fetch = FetchType.LAZY) // lazy XToOne
private Tendering tendering;
...
}
नोट से ऊपर की टिप्पणियां:
उपयोगकर्ता एक सरल के साथ (एक SecurityIdentity उप वर्ग: वहाँ अन्य संस्थाओं के लिए तीन @XToOne
रिश्ते हैं पी के रूप में पहचान पत्र, पीक्यू द्वारा संदर्भित मालिक) का प्रतिनिधित्व:
@Entity
@Table(name = "Users")
@DiscriminatorValue(value = "user")
public class User extends SecurityIdentity
{
@Column
private String name;
@OneToMany(mappedBy = "user")
private Set<PQ> pqs = new HashSet<PQ>();
...
}
समूह (क पी के रूप में एक सरल आईडी के साथ एक SecurityIdentity उप वर्ग LSO, पीक्यू का संदर्भ) है कि कि पीक्यू साथ बातचीत कर सकते उपयोगकर्ताओं का एक सेट का प्रतिनिधित्व करने के:
@Entity
@Table(name = "Groups")
@DiscriminatorValue(value = "group")
public class Group extends SecurityIdentity
{
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "pq_id", referencedColumnName = "id")
private PQ pq;
...
}
निविदा:
@Entity
@Table(name = "Tenderings")
public class Tendering implements Serializable
{
@Id
@Column(name = "pq_id", insertable = false, updatable = false)
private Integer pqId;
@Column(name = "external_code")
private String externalCode;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "pq_id", referencedColumnName = "id")
private PQ pq;
...
}
नहीं समूहों और उपयोगकर्ताओं को आईडी साझा करने के बारे में उलझन में रहें, बस उन्हें सरल आईडी के रूप में देखें। एक निविदा सिर्फ एक अलग दस्तावेज़ वस्तु है (एक से एक)।
जैसा कि आप देख सकते हैं कि पीक्यू इकाई पर तीन @XToOne
रिश्तों हैं, जो, यदि कोई fetch प्रकार सेट नहीं किया गया था, तो उत्सुकता से (जेपीए डिफ़ॉल्ट) लोड किया जाएगा। तो इसे रोकने के लिए मैंने @XToOne
संबंधों को FetchType.LAZY
के रूप में टैग किया।
23:53:55,815 INFO [stdout] Hibernate: select pq0_.id as id291_0_, pq0_.description as descript2_291_0_, pq0_.name as name291_0_, pq0_.submission_date as submission4_291_0_, pq0_.user_id as user5_291_0_ from PQs pq0_ where pq0_.id=?
23:53:55,818 INFO [stdout] Hibernate: select user0_.id as id280_0_, user0_1_.identity_type_id as identity2_280_0_, user0_.is_enabled as is1_297_0_, user0_.name as name297_0_, user0_.password as password297_0_, user0_.person_id as person5_297_0_ from Users user0_ inner join SecurityIdentities user0_1_ on user0_.id=user0_1_.id where user0_.person_id=?
23:53:55,821 INFO [stdout] Hibernate: select group0_.id as id280_0_, group0_1_.identity_type_id as identity2_280_0_, group0_.pq_id as pq2_281_0_ from Groups group0_ inner join SecurityIdentities group0_1_ on group0_.id=group0_1_.id where group0_.pq_id=?
23:53:55,823 INFO [stdout] Hibernate: select tendering0_.pq_id as pq1_296_0_, tendering0_.binary_file as binary2_296_0_, tendering0_.customer_id as customer6_296_0_, tendering0_.description as descript3_296_0_, tendering0_.external_code as external4_296_0_, tendering0_.title as title296_0_ from Tenderings tendering0_ where tendering0_.pq_id=?
तीन अतिरिक्त का चयन करता है @XToOne रिश्तों से स्टेम (नेट पर कई स्थानों में वर्णित है):
अब जब
em.find(PQ.class, someExistingId);
का उपयोग कर रहा हाइबरनेट उत्पादन मिलता है। स्रोत मैं ज्यादातर देख रहा था यह है:
Making a OneToOne-relation lazy
के रूप में वहाँ उल्लेख किया है, @ManyToOne
संबंध User user
प्राप्त नहीं किया जा चाहिए:
@ManyToOne(fetch=FetchType.LAZY)
ठीक काम करना चाहिए।
... यहाँ पीक्यूको उपयोगकर्ता से संबंध है, लेकिन यह लाए जाने के रूप में आप select user0_.id as id280_0_, ...
बयान से देख सकते हैं है ...
अन्य दो Group group
और Tendering tendering
के लिए, @OneToOne
रिवर्स मैपिंग्स, विदेशी कुंजी पीक्यू टेबल की पीके (आईडी) का संदर्भ देती है, जिसके परिणामस्वरूप पीक्यू इकाई में एक ही मैपिंग होती है।
ध्यान दें कि सभी तीन रिश्ते वैकल्पिक नहीं हैं: एक पीक्यू में हमेशा एक मालिक (उपयोगकर्ता) होता है, और एक पीक्यू हमेशा एक निविदा और समूह इकाई द्वारा संदर्भित किया जाता है। मैंने अभी तक जेपीए में अभी तक मॉडल नहीं किया था ...
तो, जब पीक्यू इकाई के तीन रिश्तों को optional = false
जोड़ने:
@Entity
@Table(name = "PQs")
public class PQ implements Serializable
{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private Integer id;
@Column
private String name;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "user_id", referencedColumnName = "person_id")
private User user;
@OneToOne(mappedBy = "pq", fetch = FetchType.LAZY, optional = false)
private Group group;
@OneToOne(mappedBy = "pq", fetch = FetchType.LAZY, optional = false)
private Tendering tendering;
...
}
... मैं निम्नलिखित हाइबरनेट आउटपुट प्राप्त:,
00:47:34,397 INFO [stdout] Hibernate: select pq0_.id as id361_0_, pq0_.description as descript2_361_0_, pq0_.name as name361_0_, pq0_.submission_date as submission4_361_0_, pq0_.user_id as user5_361_0_ from PQs pq0_ where pq0_.id=?
00:47:34,410 INFO [stdout] Hibernate: select user0_.id as id350_0_, user0_1_.identity_type_id as identity2_350_0_, user0_.is_enabled as is1_367_0_, user0_.name as name367_0_, user0_.password as password367_0_, user0_.person_id as person5_367_0_ from Users user0_ inner join SecurityIdentities user0_1_ on user0_.id=user0_1_.id where user0_.person_id=?
00:47:34,413 INFO [stdout] Hibernate: select group0_.id as id350_0_, group0_1_.identity_type_id as identity2_350_0_, group0_.pq_id as pq2_351_0_ from Groups group0_ inner join SecurityIdentities group0_1_ on group0_.id=group0_1_.id where group0_.pq_id=?
ध्यान दें कि मैं केवल किया गया है पीक्यू इकाई पर optional = false
के साथ खेलना, क्योंकि यह मैं em.find(...)
में उपयोग करता हूं। (यदि यह पर्याप्त नहीं है, मुझे प्रबुद्ध कृपया।)
मेरा प्रश्न अब दो गुना है:
- क्यों है
@ManyToOne
कोUser
इकाई बेसब्री से दिलवाया (दिया जाता है कहा गया था कि lazily काम करने , Making a OneToOne-relation lazy देखें)? Tendering
इकाई के साथ संबंध क्यों छोड़ा जा रहा है? ऐसा इसलिए है क्योंकिTendering
इकाई पीके के पीके कॉलम को पीके के रूप में संदर्भित करती है (@Id
Tendering
में), जोGroup
इकाई नहीं है (पीक्यू के पीके से नियमित संबंध)?
क्या गलत है? मैं इन गैर-वैकल्पिक संबंधों को आलसी कैसे बना सकता हूं? (कोड-इंस्ट्रूमेंटेशन या अन्य हैक के बिना, केवल सादा एनोटेशन ...)
मुझे पता है कि ज़ज़ी चीज़ जेपीए प्रदाता के लिए आलसी लोडिंग के बारे में कुछ करने के लिए सिर्फ एक संकेत है या नहीं, लेकिन इस मामले में ऐसा लगता है जैसे कुछ और गलत है (क्योंकि इसका हिस्सा काम कर रहा है)।
पीएस: मैं हाइबरनेट 4.0 बीटा का उपयोग कर रहा हूं, जो संस्करण जेबॉस 7.0.0 के साथ आता है। केवल जेपीए एनोटेशन के साथ अंतिम (ऊपर सभी जेपीए 1.0 संगत हैं)।
शायद यह सिर्फ एक बग है। Https: // हाइबरनेट देखें।onjira.com/browse/HHH-3930, जो समान है। –