ग्रिल्स में HibernateCriteriaBuilder का उपयोग करते समय मुझे त्रुटि संदेश का "मूल मूल्य एक आदिम प्रकार सेटर की संपत्ति को सौंपा गया था" क्यों मिलता है


100

मेरे ग्रेन डोमेन ऑब्जेक्ट में एक आदिम विशेषता का उपयोग करते समय मुझे निम्न त्रुटि मिलती है:

Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
 org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter of MyDomain.myAttribute
at grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:1077)

अपने डेटा इनपुट में गड़बड़ी न करें और आपको गैर-आदिम आवरणों का उपयोग नहीं करना पड़ेगा। मैं कुछ मूल्यों को दर्ज करने से चूक गया और मैंने इसे डेटाबेस में जोड़कर इस त्रुटि को ठीक किया।
गोट

जवाबों:



46

एक अशक्त मान को एक आदिम प्रकार को नहीं सौंपा जा सकता है, जैसे कि int, long, boolean, आदि। यदि डेटाबेस कॉलम जो आपके ऑब्जेक्ट में फ़ील्ड से मेल खाता है, वह शून्य हो सकता है, तो आपका फ़ील्ड एक आवरण वर्ग होना चाहिए, जैसे Integer, Long, value बूलियन, आदि।

खतरा यह है कि डीबी में कोई नल नहीं है, तो आपका कोड ठीक चलेगा, लेकिन एक बार नल डालने के बाद विफल हो जाएगा।

और आप हमेशा गाइटर से आदिम प्रकार वापस कर सकते हैं। उदाहरण के लिए:

  private Integer num;

  public void setNum(Integer i) {
    this.num = i;
  }

  public int getNum() {
    return this.num;
  }

लेकिन ज्यादातर मामलों में आप रैपर क्लास को वापस करना चाहेंगे।

इसलिए या तो नल को अनुमति न देने के लिए अपना डीबी कॉलम सेट करें, या एक आवरण वर्ग का उपयोग करें।


13

एक आदिम प्रकार शून्य नहीं हो सकता। तो समाधान आपकी तालिका में प्राइमरी प्रकार को आदिम आवरण पेपर के साथ बदल देता है। जैसे कि:

@Column(nullable=true, name="client_os_id")
private Integer client_os_id;

public int getClient_os_id() {
    return client_os_id;
}

public void setClient_os_id(int clientOsId) {
    client_os_id = clientOsId;
}

संदर्भ http://en.wikipedia.org/wiki/Primitive_wrapper_class एक आदिम प्रकार के आवरण वर्ग को खोजने के लिए।


8

मैं आपको एक उदाहरण की मदद से समझने की कोशिश करूँगा। मान लें कि आपके पास दो कॉलम और आईडी (int) और NAME (स्ट्रिंग) के साथ एक रिलेशनल टेबल (छात्र) था। अब ORM के रूप में आपने एक इकाई वर्ग को कुछ इस तरह बनाया होगा: -

package com.kashyap.default;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @author vaibhav.kashyap
 *
 */
@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -1354919370115428781L;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "NAME")
    private String name;

    public Student(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

मान लें कि तालिका में पहले से ही प्रविष्टियाँ हैं। अब अगर कोई आपसे "AGE" (int) का एक और कॉलम जोड़ता है

अन्य छात्र छात्रों के लिए पूरी तरह से अलग है

आपको पहले से भरी हुई तालिका में एक और कॉलम जोड़ने के लिए डिफ़ॉल्ट मानों को NULL के रूप में सेट करना होगा। इससे आप क्लास में एक और फील्ड जोड़ सकते हैं। अब सवाल उठता है कि क्या आप क्षेत्र की घोषणा के लिए एक आदिम डेटा प्रकार या गैर आदिम आवरण डेटा प्रकार का उपयोग कर रहे हैं।

@Column(name = "AGE")
private int age;

या

@Column(name = "AGE")
private INTEGER age;

आपको फ़ील्ड को गैर-आदिम आवरण डेटा प्रकार के रूप में घोषित करना होगा क्योंकि कंटेनर इकाई के साथ तालिका को मैप करने का प्रयास करेगा। इसलिए यह पूर्ण मानों (डिफ़ॉल्ट) को मैप करने में सक्षम नहीं होगा, यदि आप फ़ील्ड को आवरण के रूप में घोषित नहीं करेंगे और अंततः "शून्य मान को आदिम प्रकार के सेटर की संपत्ति को सौंपा गया था" अपवाद।


6

प्रकार के रूप में पूर्णांक का उपयोग करें और तदनुसार सेटर / गेट्टर प्रदान करें।

private Integer num;

public Integer getNum()...

public void setNum(Integer num)...

4

अपने एंटिटी वर्गों में आदिम का उपयोग न करें , उनके संबंधित रैपर के बजाय का उपयोग करें। यही इस समस्या को ठीक करेगा।

अपने इकाई वर्गों में से आप अपने कोड प्रवाह के बाकी हिस्सों के लिए! = Null सत्यापन का उपयोग कर सकते हैं।


3

या तो पूरी तरह से nullडीबी के माध्यम से NOT NULLऔर हाइबरनेट इकाई में इसके माध्यम से बचें @Column(nullable = false)या Longआप longआदिम के बजाय आवरण का उपयोग करें ।

एक आदिम वस्तु नहीं है, इसलिए आप nullइसे असाइन नहीं कर सकते ।


3

दो रास्ते हैं

  • सुनिश्चित करें कि db कॉलम की अनुमति नहीं है null
  • आदिम प्रकार चर के लिए उपयोगकर्ता आवरण कक्षाएं private int var; आरंभ जा सकती हैंprivate Integer var;

2

@ दीन न्हाट, आपकी सेटर विधि गलत लगती है क्योंकि आपने एक आदिम प्रकार फिर से वहां डाल दिया है और यह होना चाहिए:

public void setClient_os_id(Integer clientOsId) {
client_os_id = clientOsId;
}

2

आदिम से ऑब्जेक्ट के लिए पैरामीटर प्रकार बदलें और सेटर में एक शून्य जांच डालें। नीचे उदाहरण देखें

public void setPhoneNumber(Long phoneNumber) {
    if (phoneNumber != null)
        this.phoneNumber = phoneNumber;
    else
        this.extension = 0l;
}


1

सुनिश्चित करें कि आपके डेटाबेस myAttribute क्षेत्र में शून्य के बजाय रिक्त है।

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