হাইবারনেট: "ফিল্ড 'আইডি'র ডিফল্ট মান হয় না"


130

হাইবারনেটের একটি সাধারণ সমস্যা যা আমি মনে করি তার মুখোমুখি হয়েছি, তবে এটি সমাধান করতে পারছে না (হাইবারনেট ফোরামগুলি অপ্রচারনীয় হওয়ার কারণে অবশ্যই সহায়তা করে না)।

আমার একটি সহজ ক্লাস রয়েছে যা আমি চালিয়ে যেতে চাই তবে তা পেতে থাকুন:

SEVERE: Field 'id' doesn't have a default value
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not insert: [hibtest.model.Mensagem]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    [ a bunch more ]
Caused by: java.sql.SQLException: Field 'id' doesn't have a default value
    [ a bunch more ]

অবিরাম শ্রেণীর জন্য সম্পর্কিত কোডটি হ'ল:

package hibtest.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Mensagem  {
    protected Long id;

    protected Mensagem() { }

    @Id
    @GeneratedValue
    public Long getId() {
        return id;
}

    public Mensagem setId(Long id) {
        this.id = id;
        return this;
    }
}

এবং আসল চলমান কোডটি কেবল সরল:

SessionFactory factory = new AnnotationConfiguration()
    .configure()
    .buildSessionFactory();

{
    Session session = factory.openSession();
    Transaction tx = session.beginTransaction();

    Mensagem msg = new Mensagem("YARR!");

    session.save(msg);

    tx.commit();
    session.close();
}

আমি টীকাটির মধ্যে কিছু "কৌশল" চেষ্টা করেছি GeneratedValueতবে এটি কার্যকর হবে বলে মনে হয় না। আরম্ভ করা idহয় না সাহায্য করে! (যেমন Long id = 20L)

কেউ কি কিছু আলোকপাত করতে পারে?

সম্পাদনা 2: নিশ্চিত: সাথে জগাখিচুড়ি @GeneratedValue(strategy = GenerationType.XXX)এটি সমাধান করে না

সমাধান করা : ডাটাবেস পুনরুদ্ধার করা সমস্যার সমাধান করে


স্ট্রিং ব্যবহার করে কনস্ট্রাক্টরের উত্স কী?
মাইকেল প্রলো

দুঃখিত, আমি এটি বাদ দিয়েছি। পাস করা মান সহ কেবল একটি স্ট্রিং ফিল্ড আরম্ভ করে।
আন্দ্রে চেল্লা

1
আপনি কীভাবে ডাটাবেস সাইডে আইডি তৈরি করছেন?
জেমস ম্যাকমাহন

5
ধন্যবাদ ! কৌশল পরিবর্তন করার সময় ডাটাবেস পুনরায় তৈরি করার কথা কখনও ভাবেনি। :-)
জান গয়েভার্টস

1
আমি পরিবর্তন GenerationTypeমধ্যে @GeneratedValueথেকে IDENTITYকরতে AUTOএবং এটা আমার জন্য কাজ করেন। এছাড়াও, আপনি মাইএসকিউএলে স্বতঃবৃদ্ধি সম্পত্তি সেট করতে পারেন।
বিশ্রান্ত

উত্তর:


113

কখনও কখনও মডেল বা ORM এ করা পরিবর্তনগুলি কার্যকর করার পরেও ডাটাবেসে সঠিকভাবে প্রতিফলিত হতে পারে না SchemaUpdate

যদি ত্রুটিটি আসলে একটি বোধগম্য ব্যাখ্যার অভাব বলে মনে হয়, তবে ডাটাবেসটি পুনরায় তৈরি করার চেষ্টা করুন (বা কমপক্ষে একটি নতুন তৈরি করুন) এবং এটি দিয়ে ভাসিয়ে দিন SchemaExport


13
অনেক ক্ষেত্রে এই সমস্যাটি কেবল আপত্তিজনক টেবিল (বা টেবিলগুলি) ফেলে দিয়ে সমাধান করা যেতে পারে, ধরে নিই যে হাইবারনেটটি স্বয়ংক্রিয়ভাবে ডিবি স্কিমা তৈরি / পরিচালনা করার জন্য সেট আপ করা হয়েছে। পরিচালিত স্কিমা থেকে টেবিলগুলি ফেলে দেওয়া SET foreign_key_checks = 0;আপনার বন্ধু। SET foreign_key_checks = 1;আপনার কাজটি শেষ হওয়ার সময় নিশ্চিত হন ।
অ্যারথ

আমি একই সমস্যা পেয়েছি এবং আপনার উত্তরগুলি দিয়ে চেষ্টা করেছি তবে আবার একই ত্রুটি পেয়েছে আমি কী ভুল জানি না ...... আমি মাইএসকিএল ডেটা বেস ব্যবহার করছি।
ক্রুনাল প্যাটেল

56

আপনি যদি মাইএসকিউএল থেকে স্বয়ংক্রিয়ভাবে প্রাথমিক কী তৈরি করতে চান তবে টেবিলটি তৈরি করার সময় আপনাকে তা জানাতে হবে। ওরাকলে আপনাকে এটি করতে হবে না।

প্রাথমিক কীতে আপনাকে অন্তর্ভুক্ত করতে হবে AUTO_INCREMENT। নীচে উদাহরণ দেখুন।

CREATE TABLE `supplier`  
(  
  `ID` int(11) NOT NULL **AUTO_INCREMENT**,  
  `FIRSTNAME` varchar(60) NOT NULL,  
  `SECONDNAME` varchar(100) NOT NULL,  
  `PROPERTYNUM` varchar(50) DEFAULT NULL,  
  `STREETNAME` varchar(50) DEFAULT NULL,  
  `CITY` varchar(50) DEFAULT NULL,  
  `COUNTY` varchar(50) DEFAULT NULL,  
  `COUNTRY` varchar(50) DEFAULT NULL,  
  `POSTCODE` varchar(50) DEFAULT NULL,  
  `HomePHONENUM` bigint(20) DEFAULT NULL,  
  `WorkPHONENUM` bigint(20) DEFAULT NULL,  
  `MobilePHONENUM` bigint(20) DEFAULT NULL,  
  `EMAIL` varchar(100) DEFAULT NULL,  
  PRIMARY KEY (`ID`)  
) 

ENGINE=InnoDB DEFAULT CHARSET=latin1;  

এখানে সত্তা

package com.keyes.jpa;  

import java.io.Serializable;
import javax.persistence.*;
import java.math.BigInteger;

/**
 * The persistent class for the parkingsupplier database table.
 * 
 */
@Entity
@Table(name = "supplier")
public class supplier implements Serializable
{
  private static final long serialVersionUID = 1L;

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

  @Column(name = "CITY")
  private String city;

  @Column(name = "COUNTRY")
  private String country;

  @Column(name = "COUNTY")
  private String county;

  @Column(name = "EMAIL")
  private String email;

  @Column(name = "FIRSTNAME")
  private String firstname;

  @Column(name = "HomePHONENUM")
  private BigInteger homePHONENUM;

  @Column(name = "MobilePHONENUM")
  private BigInteger mobilePHONENUM;

  @Column(name = "POSTCODE")
  private String postcode;

  @Column(name = "PROPERTYNUM")
  private String propertynum;

  @Column(name = "SECONDNAME")
  private String secondname;

  @Column(name = "STREETNAME")
  private String streetname;

  @Column(name = "WorkPHONENUM")
  private BigInteger workPHONENUM;

  public supplier()
  {
  }

  public long getId()
  {
    return this.id;
  }

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

  public String getCity()
  {
    return this.city;
  }

  public void setCity(String city)
  {
    this.city = city;
  }

  public String getCountry()
  {
    return this.country;
  }

  public void setCountry(String country)
  {
    this.country = country;
  }

  public String getCounty()
  {
    return this.county;
  }

  public void setCounty(String county)
  {
    this.county = county;
  }

  public String getEmail()
  {
    return this.email;
  }

  public void setEmail(String email)
  {
    this.email = email;
  }

  public String getFirstname()
  {
    return this.firstname;
  }

  public void setFirstname(String firstname)
  {
    this.firstname = firstname;
  }

  public BigInteger getHomePHONENUM()
  {
    return this.homePHONENUM;
  }

  public void setHomePHONENUM(BigInteger homePHONENUM)
  {
    this.homePHONENUM = homePHONENUM;
  }

  public BigInteger getMobilePHONENUM()
  {
    return this.mobilePHONENUM;
  }

  public void setMobilePHONENUM(BigInteger mobilePHONENUM)
  {
    this.mobilePHONENUM = mobilePHONENUM;
  }

  public String getPostcode()
  {
    return this.postcode;
  }

  public void setPostcode(String postcode)
  {
    this.postcode = postcode;
  }

  public String getPropertynum()
  {
    return this.propertynum;
  }

  public void setPropertynum(String propertynum)
  {
    this.propertynum = propertynum;
  }

  public String getSecondname()
  {
    return this.secondname;
  }

  public void setSecondname(String secondname)
  {
    this.secondname = secondname;
  }

  public String getStreetname()
  {
    return this.streetname;
  }

  public void setStreetname(String streetname)
  {
    this.streetname = streetname;
  }

  public BigInteger getWorkPHONENUM()
  {
    return this.workPHONENUM;
  }

  public void setWorkPHONENUM(BigInteger workPHONENUM)
  {
    this.workPHONENUM = workPHONENUM;
  }

}

13

আপনি অবশ্যই আপনার hbm2ddl সম্পত্তি আপডেট ব্যবহার করা উচিত। পরিবর্তনগুলি করুন এবং এটি তৈরিতে আপডেট করুন যাতে এটি টেবিলটি তৈরি করতে পারে।

<property name="hbm2ddl.auto">create</property>

এটা আমার জন্য কাজ করেছে।


1
এটা আমার জন্য কাজ। হাইবারনেট + + ডার্বি ডিবি @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; মান আর createhbm2ddl.autoসম্পত্তি পরিবর্তনগুলি আমার ডাটাবেজ স্কিমা প্রয়োগ। অনেক অনেক ধন্যবাদ ....
অ্যাডাম এম গ্যাম্বোয়া জি।

12

কটাক্ষপাত GeneratedValueএর কৌশল। এটি সাধারণত কিছু দেখতে লাগে:

@GeneratedValue(strategy=GenerationType.IDENTITY)

কেবল এটির পরামর্শ দেওয়ার জন্য, .আউটো এর পরিবর্তে এটি ব্যবহার করে দেখুন।
জেমস ম্যাকমাহন

আমাকে আগামীকাল এটি পরীক্ষা করতে হবে, তবে আমি প্রায় নিশ্চিত যে এটি ঠিক করতে চলেছে না। জেনারেশন টাইপ.আউটো ব্যবহার করে আমি প্রচুর আইডি কী দেখতে পাচ্ছি। যাইহোক, আমি আগামীকাল এটি পরীক্ষা করে নিশ্চিত করব।
আন্দ্রে চেল্লা

নিশ্চিত হয়েছে - সহায়তা করে না
আন্দ্রে চেল্লা

6

ডাটাবেস থেকে ম্যানুয়ালি টেবিলটি ফেলে দেওয়া এবং তারপরে অ্যাপ্লিকেশনটি আবার চালানো আমার পক্ষে কাজ করে। আমার ক্ষেত্রে সারণীটি সঠিকভাবে তৈরি করা হয়নি (বাধা সহ) আমার ধারণা।


দুর্দান্ত সমাধান। সেভাবে ভাবিনি। ধন্যবাদ
মেইর

আমরা আইডি কলাম বা জেনারেশন প্রকার
যাদ্দা

5

আমার এই সমস্যা ছিল। আমার ভুলটি ছিল আমি সন্নিবেশযোগ্য এবং আপডেটযোগ্য ফাইলগুলি মিথ্যা হিসাবে সেট করেছিলাম এবং অনুরোধে ক্ষেত্রটি সেট করার চেষ্টা করছিলাম। এই ক্ষেত্রটি ডিবিতে কোন নন হিসাবে সেট করা আছে।

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = false, updatable = false, nullable=false)
@JsonBackReference
private Role role;

পরে আমি এটিকে পরিবর্তন করেছি - সন্নিবেশযোগ্য = সত্য, আপডেটযোগ্য = সত্য

@ManyToOne
@JoinColumn(name="roles_id",  referencedColumnName = "id", insertable = true, updatable = true, nullable=false)
@JsonBackReference
//@JsonIgnore
private Role role;

এটি পুরোপুরি পরে কাজ করেছিল।



4

ত্রুটি বার্তার কারণে আমি এখানে এসেছি, দেখা যাচ্ছে একই নামের দুটি টেবিল আমার রয়েছে।


আমার কাছে একই জিনিসটি ঘটেছিল: মাইএসকিউএল ওয়ার্কবেঞ্চটি কেবল একটি 'ব্যবহারকারীর' টেবিলটি দেখিয়েছিল, তবে, আমি ডাটাবেসে সমস্ত টেবিলগুলি ফেলে দেওয়ার পরে হঠাৎ এটি অন্য 'ব্যবহারকারীর' টেবিলটি দেখায় যা আগে দেখা যায়নি ...
এসএনডি

3

আরেকটি পরামর্শ হ'ল আপনি স্বয়ংক্রিয়ভাবে উত্পন্ন ক্ষেত্রের জন্য কোনও বৈধ প্রকার ব্যবহার করেন কিনা তা পরীক্ষা করা। মনে রাখবেন এটি স্ট্রিংয়ের সাথে কাজ করে না, তবে এটি লংয়ের সাথে কাজ করে:

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public Long id;

@Constraints.Required
public String contents;

উপরের সিনট্যাক্সটি জেপিএ ২.০ সরবরাহকারী হিসাবে হাইবারনেট ব্যবহার করে মাইএসকিউএলে সারণী উত্পন্ন করার জন্য কাজ করেছিল।


স্ট্রিংকে লংতে পরিবর্তন করা আমার জন্য এটি স্থির করে। ধন্যবাদ
জালার্স 62

3

আমারও একই সমস্যা ছিল। আমি বিদেশী কী টীকাটি ব্যবহার করে হাইবারনেট ওয়ান-টু ওয়ান ম্যাপিংয়ের টিউটোরিয়ালটি পেয়েছি এবং নীচের মত ধাপে ধাপে অনুসরণ করেছি:

এই স্ক্রিপ্ট দিয়ে ডাটাবেস টেবিল তৈরি করুন:

create table ADDRESS (
   id INT(11) NOT NULL AUTO_INCREMENT,
   street VARCHAR(250) NOT NULL,
   city  VARCHAR(100) NOT NULL,
   country  VARCHAR(100) NOT NULL,
   PRIMARY KEY (id)
);

create table STUDENT (
    id            INT(11) NOT NULL AUTO_INCREMENT, 
    name          VARCHAR(100) NOT NULL, 
    entering_date DATE NOT NULL, 
    nationality   TEXT NOT NULL, 
    code          VARCHAR(30) NOT NULL,
    address_id INT(11) NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT student_address FOREIGN KEY (address_id) REFERENCES ADDRESS (id)   
);

উপরের টেবিলগুলি সহ সত্তা এখানে

@Entity
@Table(name = "STUDENT")
public class Student implements Serializable {

    private static final long serialVersionUID = 6832006422622219737L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

 }

@Entity
@Table(name = "ADDRESS")
public class Address {

    @Id @GeneratedValue
    @Column(name = "ID")
    private long id;
}

সমস্যাটি সমাধান করা হয়েছিল।

বিজ্ঞপ্তি: প্রাথমিক কীটি অবশ্যই আউটপুট অবধি সেট করতে হবে


2

কেবল নাল-সীমাবদ্ধতা যুক্ত করুন

আমারও একই সমস্যা ছিল। আমি এক্সএমএল ম্যাপিংয়ে সবেমাত্র নাল-বাধা যুক্ত করেছি। এটা কাজ করেছে

<set name="phone" cascade="all" lazy="false" > 
   <key column="id" not-null="true" />
   <one-to-many class="com.practice.phone"/>
</set>

2

টেবিল স্কিমা সমস্যা হতে পারে। টেবিলটি ফেলে দিন এবং অ্যাপ্লিকেশনটি পুনরায় চালু করুন।


1

উপরে বর্ণিত বিষয়গুলি ছাড়াও, এই উদাহরণটির মতো অটো ইনক্রিমেন্ট তৈরি করার জন্য বর্গ টেবিল তৈরি করার সময় ভুলবেন না

CREATE TABLE MY_SQL_TABLE (

  USER_ID INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  FNAME VARCHAR(50) NOT NULL,
  LNAME VARCHAR(20) NOT NULL,
  EMAIL VARCHAR(50) NOT NULL
);

0

নির্দিষ্ট টেবিলের কলাম আইডির জন্য ডিফল্ট মান কিনা তা দয়া করে পরীক্ষা করুন if যদি এটি ডিফল্ট হিসাবে না করে


0

আমারও একই সমস্যা ছিল। আমি একটি যোগদান টেবিল ব্যবহার করছিলাম এবং আমার কাছে একটি সারিতে আইডি ফিল্ড এবং দুটি বিদেশী কী ছিল। সঠিক কারণটি আমি জানি না তবে আমি নিম্নলিখিতগুলি করেছি

  1. মাইএসকিউএল 5.5.13 সম্প্রদায়ে আপগ্রেড করা হয়েছে
  2. ক্লাস এবং টেবিলটির নতুন নাম দিন
  3. নিশ্চিত করুন যে আমার কাছে হ্যাশকোড ছিল এবং সমান পদ্ধতি

    @Entity 
    @Table(name = "USERGROUP")
    public class UserGroupBean implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "USERGROUP_ID")
    private Long usergroup_id;
    
    @Column(name = "USER_ID")   
    private Long user_id;
    
    @Column(name = "GROUP_ID")
    private Long group_id;

0

যদি কোনও ডিবি টেবিলে কোনও পুরানো অবিরত কলাম থাকে তবে একই ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল।

উদাহরণস্বরূপ: attribute_id NOT NULL BIGINT(20),এবংattributeId NOT NULL BIGINT(20),

ব্যবহৃত বৈশিষ্ট্য অপসারণের পরে, আমার ক্ষেত্রে চুক্তিআইডিতে , সমস্যাটি সমাধান করা হয়েছিল।


0

একটি @ManyToManyসম্পর্ক নিয়ে আমার সাথে এটি ঘটেছিল । আমি সম্পর্কের ক্ষেত্রে একটি ক্ষেত্রকে টিকা দিয়েছিলাম @JoinTable, আমি এটি সরিয়েছি এবং এর mappedByপরিবর্তে @ManyToMany এ বৈশিষ্ট্যটি ব্যবহার করেছি ।


আপনি একটি উদাহরণ প্রদান করতে পারেন?
মালেনা টি

0

আমি কোডটি চেষ্টা করেছি এবং আমার ক্ষেত্রে নীচের কোডটি সমস্যার সমাধান করেছে। আমি স্কিমা ঠিকমতো নিষ্পত্তি করি নি

@Entity
    @Table(name="table"
         ,catalog="databasename"
      )

,catalog="databasename" আমি যেমন করেছিলাম তেমন যুক্ত করার চেষ্টা করুন ।

,catalog="databasename"

0

আমার ক্ষেত্রে, আমি আপত্তিজনক টেবিলগুলি এবং ক্ষেত্রের "আইডি" প্রশ্নে এটি পরিবর্তন করেছিলাম আমি এটি স্বয়ংক্রিয় ক্রিমেন্ট তৈরি করেছি, আমার এখনও এটি নির্ধারণের প্রয়োজন যে কেন স্থাপনার সময় এটি এটি "স্বয়ংক্রিয় ক্রিমেন্ট" তৈরি করে না কেন যাতে আমার নিজেরাই এটি করতে হয়!


0

এই সম্পর্কে কি:

<set name="fieldName" cascade="all"> 
   <key column="id" not-null="true" />
   <one-to-many class="com.yourClass"/>
</set>

আমি এটি আপনাকে সাহায্য করে আশা করি।


0

Longবস্তুর longপ্রকারকে আদিম ধরণের পরিবর্তনের চেষ্টা করুন (যদি আদিম ব্যবহারগুলি আপনার পক্ষে ঠিক থাকে)।

আমার একই সমস্যা ছিল এবং পরিবর্তনের ধরণটি আমাকে সহায়তা করেছিল।


0

আমার এই সমস্যাটি ছিল, ভুল করে আমি @Transientparticular নির্দিষ্ট বৈশিষ্ট্যের উপরে টিকা দিয়েছিলাম । আমার ক্ষেত্রে এই ত্রুটিটি বোঝা যায়।


0

"ক্ষেত্র 'আইডি'র ডিফল্ট মান নেই" কারণ আপনি টীকাতে ঘোষণা GenerationType.IDENTITYকরেন নি GeneratedValue

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

0

এই সমস্যাটি হ'ল কারণ কখনও কখনও আপনাকে আবার ডাটাবেস আপডেট / ডেটাবেস তৈরি করতে হবে বা কখনও কখনও আপনি যদি ডিবি টেবিলের ক্ষেত্রে ক্ষেত্রটি যুক্ত করেছেন তবে সত্তা শ্রেণি নয় তবে এটি কোনও নাল মান বা শূন্য প্রবেশ করতে পারে না তাই এই ত্রুটিটি এসেছিল। সুতরাং উভয় পক্ষের পরীক্ষা করুন .ডিবি এবং সত্তা শ্রেণি।


0

যখন আপনার ক্ষেত্রটি অযোগ্য নয়, এটির জন্য একটি টেবিল তৈরিতে নির্দিষ্ট করার জন্য একটি ডিফল্ট মান প্রয়োজন। যথাযথভাবে আরম্ভ করা হয়েছে এমন একটি টেবিলটি পুনরায় তৈরি করুন যাতে ডিবি এটির দ্বারা নিজেই উত্পন্ন করবে এবং কখনই সেখানে নাল রাখবে না D

CREATE TABLE Persons (
Personid int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (Personid)

);

https://www.w3schools.com/sql/sql_autoincrement.asp


0

মডেল ক্ষেত্রটি ডিবিতে সঠিক টেবিল ক্ষেত্রের সাথে মেলে না, তখন আমি জিসিপি ক্লাউড এসকেএলে এ জাতীয় ত্রুটি পেয়েছি। উদাহরণ: মডেল ক্ষেত্রে যখন fieldName
ডিবিতে সারণি থাকে তখন ক্ষেত্রের field_name ফিক্সিং টেবিল ক্ষেত্রের নামটি আমাকে সহায়তা করে।


-1

hashCode()আপনার সত্তা বিন ক্লাসে একটি পদ্ধতি যুক্ত করুন এবং এটি আবার চেষ্টা করুন


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