मुझे माता-पिता के बच्चे के प्रकार के संबंधों में समस्या का सामना करना पड़ रहा है।
हाइबरनेट दस्तावेज़ माता-पिता से विदेशी कुंजी का मूल्य प्राप्त करने के लिए बाल वर्ग में "अनेक-से-एक" संबंध जोड़ने के लिए कहते हैं। लेकिन इस संबंध को काम करने के लिए मुझे बाल वर्ग में चालान संपत्ति जोड़नी है जो माता-पिता को बच्चे में एक परिपत्र समावेशन पेश करती है और मेरे धारावाहिक को तोड़ देती है। क्या कोई इंगित कर सकता है कि मैं कहाँ गलती कर रहा हूँ?

यहाँ मेरा कोड है:

चालान.जावा

public class Invoice implements Serializable {
  private Long id;
  private Date invDate;
  private String customer;
  private Set<InvoiceItem> items;
  ... getters/setters ...
}

चालानआइटम.जावा

public class InvoiceItem implements Serializable {
  private Long itemId;
  private long productId;
  private int quantity;
  private double price;
  private Invoice invoice; //???????
  ... getters/setters ...
}

चालान.एचबीएम.एक्सएमएल

<class name="Invoice" table="Invoices">
  <id name="id" column="ID" type="long">
    <generator class="native" />
  </id>
  <property name="invDate" type="timestamp" />
  <property name="customer" type="string" />

  <set name="items" inverse="true" cascade="all-delete-orphan">
    <key column="invoiceId" />
    <one-to-many class="InvoiceItem" />
  </set>
</class>

InvoiceItem.hbm.xml

<class name="InvoiceItem" table="InvoiceItems">
  <id name="itemId" type="long" column="id">
    <generator class="native" />
  </id>

  <property name="productId" type="long" />
  <property name="quantity" type="int" />
  <property name="price" type="double" />

<many-to-one name="invoiceId" class="Invoice" not-null="true"/> <!--????????-->
</class>
0
WSK 15 जुलाई 2010, 15:26

1 उत्तर

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

यदि आप व्युत्क्रम = "सत्य" विशेषता को हटाते हैं, तो आपके पास इनवॉइस इटैम में इनवॉइस का संदर्भ होना आवश्यक नहीं है। फिर हाइबरनेट InvoiceItem तालिका में एक विदेशी कुंजी का उपयोग करने के बजाय एक अलग मैपिंग तालिका बनाएगा।

InvoiceItem सेट पर inverse एट्रिब्यूट को हटा दें, और इनवॉइस आइटम से इनवॉइस प्रॉपर्टी को भी हटा दें, और मैपिंग में संबंधित many-to-one और आपको वह मिल जाना चाहिए जो आप चाहते हैं।

वैकल्पिक रूप से, आप इनवॉइस इटैम में इनवॉइस संदर्भ को क्षणिक के रूप में चिह्नित कर सकते हैं, और डिसेरिएलाइज़ेशन के दौरान मान को पॉप्युलेट करना संभाल सकते हैं: इनवॉइस में आइटम्स के सेट पर पुनरावृति करें, और प्रत्येक आइटम पर invoice प्रॉपर्टी को मालिकाना इनवॉइस पर सेट करें।

2
mdma 15 जुलाई 2010, 16:37
मैंने पहले विकल्प की कोशिश की लेकिन त्रुटि हो रही है: "फ़ील्ड 'चालान आईडी' का डिफ़ॉल्ट मान नहीं है"। (बीटीडब्ल्यू विदेशी कुंजी डीबी में शून्य नहीं है और मैं इसे निरर्थक नहीं बनाना चाहता)। यहां हाइबरनेट दस्तावेज़ बाल वर्ग में कई-से-एक संबंध जोड़ने का सुझाव देते हैं जिससे मैं बचने की कोशिश कर रहा हूं
 – 
WSK
15 जुलाई 2010, 15:58
उल्लेख करना भूल गए, चालान में के अंतर्गत तत्व में not-null="true" जोड़ें।
 – 
mdma
15 जुलाई 2010, 16:03
महान। दोनों दृष्टिकोण काम करते हैं। क्या उनमें से किसी को दूसरे पर पसंद किया जाता है?
 – 
WSK
15 जुलाई 2010, 16:13
यूनिडायरेक्शनल मैपिंग (बच्चे से वापस माता-पिता के संदर्भ के बिना) का उपयोग करना कभी-कभी सरल होता है, क्योंकि आपके पास चिंता करने की स्थिरता नहीं है, लेकिन जो सबसे अच्छा है उस पर निर्भर करता है कि आपको बच्चे की आवश्यकता है-> अभिभावक संदर्भ या नहीं।
 – 
mdma
15 जुलाई 2010, 16:18