नहीं-शून्य संपत्ति एक शून्य या क्षणिक मूल्य का संदर्भ देती है


83

हाइबरनेट के साथ माता-पिता / बच्चे की वस्तु को बचाने में परेशानी का सामना करना। किसी भी विचार की बहुत सराहना की जाएगी।

org.hibernate.PropertyValueException: not-null property references a null or transient value: example.forms.InvoiceItem.invoice
    at org.hibernate.engine.Nullability.checkNullability(Nullability.java:100)
        .... (truncated)

हाइबरनेट मानचित्रण:

<hibernate-mapping package="example.forms">
    <class name="Invoice" table="Invoices">
        <id name="id" type="long">
            <generator class="native" />
        </id>
        <property name="invDate" type="timestamp" />
        <property name="customerId" type="int" />
        <set cascade="all" inverse="true" lazy="true" name="items" order-by="id">
            <key column="invoiceId" />
            <one-to-many class="InvoiceItem" />
        </set>
    </class>
    <class name="InvoiceItem" table="InvoiceItems">
        <id column="id" name="itemId" type="long">
            <generator class="native" />
        </id>
        <property name="productId" type="long" />
        <property name="packname" type="string" />
        <property name="quantity" type="int" />
        <property name="price" type="double" />
        <many-to-one class="example.forms.Invoice" column="invoiceId" name="invoice" not-null="true" />
    </class>
</hibernate-mapping>

InvoiceManager.java

class InvoiceManager {

    public Long save(Invoice theInvoice) throws RemoteException {
        Session session = HbmUtils.getSessionFactory().getCurrentSession();
        Transaction tx = null;
        Long id = null;
        try {
            tx = session.beginTransaction();
            session.persist(theInvoice);
            tx.commit();
            id = theInvoice.getId();
        } catch (RuntimeException e) {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            throw new RemoteException("Invoice could not be saved");
        } finally {
            if (session.isOpen())
                session.close();
        }
        return id;
    }
}

चालान.जवा

public class Invoice implements java.io.Serializable {
    private Long id;
    private Date invDate;
    private int customerId;
    private Set<InvoiceItem> items;

    public Long getId() {
        return id;
    }
    public Date getInvDate() {
        return invDate;
    }
    public int getCustomerId() {
        return customerId;
    }
    public Set<InvoiceItem> getItems() {
        return items;
    }
    void setId(Long id) {
        this.id = id;
    }
    void setInvDate(Date invDate) {
        this.invDate = invDate;
    }
    void setCustomerId(int customerId) {
        this.customerId = customerId;
    }
    void setItems(Set<InvoiceItem> items) {
        this.items = items;
    }
}

इनवाइसइम.जावा

public class InvoiceItem implements java.io.Serializable {
    private Long itemId;
    private long productId;
    private String packname;
    private int quantity;
    private double price;
    private Invoice invoice;

    public Long getItemId() {
        return itemId;
    }
    public long getProductId() {
        return productId;
    }
    public String getPackname() {
        return packname;
    }
    public int getQuantity() {
        return quantity;
    }
    public double getPrice() {
        return price;
    }
    public Invoice getInvoice() {
        return invoice;
    }
    void setItemId(Long itemId) {
        this.itemId = itemId;
    }
    void setProductId(long productId) {
        this.productId = productId;
    }
    void setPackname(String packname) {
        this.packname = packname;
    }
    void setQuantity(int quantity) {
        this.quantity = quantity;
    }
    void setPrice(double price) {
        this.price = price;
    }
    void setInvoice(Invoice invoice) {
        this.invoice = invoice;
    }
}

जवाबों:


49

हर InvoiceItemएक होना आवश्यक है Invoiceकी वजह से इसे से जुड़े not-null="true"में कई-से-एक मानचित्रण।

इसलिए मूल विचार आपको कोड में उस स्पष्ट संबंध को स्थापित करने की आवश्यकता है। ऐसा करने के कई तरीके हैं। आपकी कक्षा में मुझे एक setItemsविधि दिखाई देती है । मुझे कोई addInvoiceItemविधि नहीं दिख रही है । जब आप आइटम सेट करते हैं, तो आपको सेट के माध्यम से लूप करना होगा और item.setInvoice(this)सभी वस्तुओं पर कॉल करना होगा। यदि आप एक addItemविधि लागू करते हैं , तो आपको वही काम करने की आवश्यकता है। या आपको InvoiceItemसंग्रह में प्रत्येक के चालान को अन्यथा सेट करने की आवश्यकता है ।


82

अनुयायियों के लिए, इस त्रुटि संदेश का अर्थ यह भी हो सकता है "आपके पास यह एक विदेशी वस्तु का संदर्भ है जिसे अभी तक डीबी में सहेजा नहीं गया है" (भले ही यह वहां है, और गैर अशक्त है)।


1
और मैं इसे कैसे हल कर सकता हूं? उदाहरण: मेरे पास Entity_A एक Entity_B स्तंभ के साथ है, और Entity_B में मेरे पास Entity_A स्तंभ है संबंध A से B तक @OneToMany है और जब मैं Entity_A को अपडेट करने का प्रयास करता हूं, तो मुझे यह अपवाद देता है, मैं Entity_A को कैसे अपडेट कर सकता हूं?
FAndrew

1
@ पहले Entity_B सहेजें?
रोजरपैक

3
और अगर मेरे पास उदाहरण के लिए 100 Entity_B है, तो मैं सभी संपादित Entity_B को खोजता हूं और अगर इसे संपादित किया गया तो मैं इसे अपडेट कर सकता हूं? यदि मैं अभी Entity_A को अपडेट करूं तो वह अच्छा नहीं होगा?
FAndrew

7

यह उतना ही सरल हो सकता है:

@Column(name = "Some_Column", nullable = false)

लेकिन जारी रखते हुए, "Some_Column" का मूल्य शून्य है, भले ही "Some_Column" कोई भी प्राथमिक या विदेशी कुंजी न हो।


2

अपनी hbm फ़ाइलों में प्राथमिक कुंजी / ऑब्जेक्ट ID के लिए सहेजे गए मानों की जाँच करें। यदि आपके पास हाइबरनेट फ्रेमवर्क द्वारा स्वचालित आईडी निर्माण है और आप आईडी को कहीं स्थापित कर रहे हैं, तो यह त्रुटि को फेंक देगा। यदि डिफ़ॉल्ट मान 0 है, तो यदि आप आईडी को 0 पर सेट करते हैं, तो आपको यह त्रुटि दिखाई देगी।


0

मैं एक ही त्रुटि प्राप्त कर रहा था, लेकिन इसे आखिरकार हल कर दिया, वास्तव में मैं ऑब्जेक्ट एंटिटी सेट नहीं कर रहा था जो पहले से ही अन्य इकाई के लिए सहेजा गया है और इसलिए यह foreeign कुंजी के लिए मिल रहा ऑब्जेक्ट मान शून्य था।



-11

उस चर को क्षणिक बनाओ। आपकी समस्या हल हो जाएगी ।।

@Column(name="emp_name", nullable=false, length=30)
    private transient String empName;

3
आप त्रुटि को हल करने और समस्या को हल नहीं करने के बारे में कह रहे हैं।
कार्तिक आर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.