গ্রিলগুলিতে হাইবারনেটক্রিটরিয়া বিল্ডার ব্যবহার করার সময় ত্রুটি বার্তাটির কেন আমি একটি "নাল মান আদিম ধরণের সেটারের সম্পত্তিতে নির্ধারিত হয়েছিল" পেতে পারি?


102

আমার গ্রিল ডোমেন অবজেক্টে আদিম গুণটি ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি:

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)

আপনার ডেটা ইনপুট গোলযোগ করবেন না এবং আপনাকে অ-আদিম মোড়ক ব্যবহার করতে হবে না। আমি কিছু মান লিখতে মিস করেছি এবং এটি ত্রুটিটি ডেটাবেসে যুক্ত করে ঠিক করতে সক্ষম হয়েছি।
গুগল

উত্তর:



48

কোনও নাল মান কোনও আদিম ধরণের যেমন ইন্ট, লম্বা, বুলিয়ান ইত্যাদিতে নির্ধারিত হতে পারে না যদি আপনার বস্তুর ক্ষেত্রের সাথে সম্পর্কিত ডাটাবেস কলামটি শূন্য হতে পারে তবে আপনার ক্ষেত্রটি পূর্ণসংখ্যা, লং, বুলিয়ান ইত্যাদি

বিপদটি হ'ল ডিবিতে কোনও নাল না থাকলে আপনার কোডটি ঠিকঠাক চলবে, তবে নালগুলি areোকানো পরে ব্যর্থ হবে।

এবং আপনি সর্বদা প্রাপ্তির কাছ থেকে আদিম প্রকারটি ফিরে আসতে পারেন। প্রাক্তন:

  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.wikedia.org/wiki/Primitive_wrapper_class রেফারেন্স ।


8

আমি উদাহরণের সাহায্যে আপনাকে বোঝানোর চেষ্টা করব। ধরুন আপনার কাছে দুটি কলাম এবং আইডি (ইনট) এবং NAME (স্ট্রিং) সহ একটি সম্পর্কিত টেবিল (শিক্ষার্থী) রয়েছে। এখন ওআরএম হিসাবে আপনি কিছুটা নীচের মতো একটি সত্তা শ্রেণি তৈরি করেছেন: -

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;
    }

}

ধরে নেওয়া যাক টেবিলে ইতিমধ্যে এন্ট্রি রয়েছে। এখন যদি কেউ আপনাকে "এজিই" (অন্তর্) এর আর একটি কলাম যুক্ত করতে বলে

টেবিল স্টুডেন্ট অ্যাজ ইন ইন নুল

প্রাক-ভরা টেবিলটিতে অন্য কলাম যুক্ত করতে আপনাকে 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

আপনার সত্তা ক্লাসে আদিম ব্যবহার করবেন না , পরিবর্তে তাদের নিজ নিজ মোড়ক ব্যবহার করুন। এটি এই সমস্যার সমাধান করবে।

আপনার সত্তা ক্লাসগুলির মধ্যে আপনি আপনার কোড প্রবাহের বাকী অংশের জন্য! = নাল বৈধতা ব্যবহার করতে পারেন।


3

হয় সে অনুযায়ী nullডিবিতে NOT NULLএবং হাইবারনেট সত্তায় পুরোপুরি এড়ানো @Column(nullable = false)বা Longআপনার longআদিম পরিবর্তে মোড়ক ব্যবহার করুন ।

আদিম কোনও বস্তু নয়, সুতরাং nullআপনি এটি বরাদ্দ করতে পারবেন না ।


3

দুটি উপায় আছে

  • নিশ্চিত করুন যে ডিবি কলামটি অনুমোদিত নয় 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 ক্ষেত্রে শূন্যের পরিবর্তে নাল রয়েছে তা নিশ্চিত করুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.