सीतनिद्रा में होना: "फ़ील्ड 'आईडी' एक डिफ़ॉल्ट मान नहीं है"


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)यह हल नहीं करता है

SOLVED: डेटाबेस को पुनःप्राप्त करने से समस्या हल हो गई


स्ट्रिंग के उपयोग से कंस्ट्रक्टर का स्रोत क्या है?
माइकल प्रालो

क्षमा करें, मैंने इसे छोड़ दिया। बस पारित मूल्य के साथ एक स्ट्रिंग फ़ील्ड को इनिशियलाइज़ करता है।
एंड्रे चलेला

1
आप डेटाबेस के आधार पर आईडी कैसे बना रहे हैं?
जेम्स मैकमोहन 1

5
धन्यवाद ! रणनीतियों को बदलते समय डेटाबेस को फिर से बनाने के बारे में कभी नहीं सोचा गया था। :-)
जन गोयवर्ट्स

1
मैं बदल गया GenerationTypeमें @GeneratedValueसे IDENTITYकरने के लिए AUTOऔर यह मेरे लिए काम किया। इसके अलावा, आप MySQL में ऑटो इंक्रीमेंट प्रॉपर्टी सेट कर सकते हैं।
विश्रांत

जवाबों:


113

कभी-कभी मॉडल या ORM में किए गए परिवर्तन डेटाबेस के निष्पादन के बाद भी सटीक रूप से प्रतिबिंबित नहीं हो सकते हैं SchemaUpdate

यदि त्रुटि वास्तव में एक समझदार व्याख्या की कमी लगती है, तो डेटाबेस को फिर से बनाने (या कम से कम एक नया बनाने) का प्रयास करें और इसे मचान के साथ करें SchemaExport


13
कई मामलों में इस समस्या को हल करने वाली तालिका (या तालिकाओं) को छोड़ने से भी हल किया जा सकता है, यह मानते हुए कि डीबी स्कीमा को स्वचालित रूप से बनाने / प्रबंधित करने के लिए हाइबरनेट की स्थापना की जाती है। प्रबंधित स्कीमा से तालिकाओं को छोड़ने के लिए, SET foreign_key_checks = 0;आपका मित्र है। बस SET foreign_key_checks = 1;जब आप कर रहे हैं सुनिश्चित करें ।
5

मैं एक ही समस्या है और अपने ans के साथ प्रयास करें, लेकिन फिर से एक ही त्रुटि मिली कि मुझे क्या गलती है मुझे नहीं पता ...... मैं mysql डेटा बेस का उपयोग कर रहा हूं।
क्रुणाल पटेल

56

यदि आप चाहते हैं कि MySQL स्वचालित रूप से प्राथमिक कुंजियाँ उत्पन्न करे तो आपको टेबल बनाते समय यह बताना होगा। आपको Oracle में ऐसा करने की आवश्यकता नहीं है।

प्राथमिक कुंजी पर आपको शामिल करना होगा 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; और संपत्ति createमें मूल्य के साथ hbm2ddl.autoमेरे डेटाबेस स्कीमा में लागू परिवर्तन। बहुत बहुत धन्यवाद ....
एडम एम। गंबा जी

12

एक नजर डालते हैं GeneratedValueरणनीति पर। यह आमतौर पर कुछ इस तरह दिखता है:

@GeneratedValue(strategy=GenerationType.IDENTITY)

बस यह सुझाव देने जा रहा हूं, इसके बजाय .AUTO का उपयोग करने का प्रयास करें।
जेम्स मैकमोहन 1

मुझे कल इसकी जांच करनी है, लेकिन मुझे यकीन है कि इसे ठीक नहीं किया जाएगा। मुझे GenerationType.AUTO का उपयोग करके बहुत सी आईडी कुंजियाँ दिखाई देती हैं। वैसे भी, मैं कल इसका परीक्षण करना सुनिश्चित करूँगा।
आंद्रे चलेला

पुष्टि की - मदद नहीं करता है
आंद्रे चलेला

6

डेटाबेस से तालिका को मैन्युअल रूप से ड्रॉप करना और फिर मेरे लिए काम किए गए एप्लिकेशन को फिर से चलाना। मेरे मामले में तालिका ठीक से नहीं बनाई गई (बाधाओं के साथ) मुझे लगता है।


महान समाधान। ऐसा नहीं सोचा था। धन्यवाद
मीर

हमें ऐसा तब करना चाहिए जब हम Id कॉलम या जनरेशन टाइप में कोई बदलाव करते हैं
Jadda

5

मेरे पास यह मुद्दा था। मेरी गलती थी कि मैंने डालने योग्य और अद्यतन योग्य को गलत के रूप में सेट किया था और अनुरोध में फ़ील्ड सेट करने का प्रयास कर रहा था। यह फ़ील्ड DB में NON NULL के रूप में सेट है।

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

यह पूरी तरह से बाद में काम किया।


updatable डिफ़ॉल्ट रूप से सच है
Janac Meena

4

मैं त्रुटि संदेश के कारण यहां आया था, पता चलता है कि मेरे पास एक ही नाम वाली दो तालिकाएँ थीं।


एक ही बात किसी तरह मेरे साथ हुई: MySQL कार्यक्षेत्र ने केवल एक 'उपयोगकर्ता' तालिका दिखाई, हालांकि, डेटाबेस में सभी तालिकाओं को छोड़ने के बाद, यह अचानक एक और 'उपयोगकर्ता' तालिका दिखाई दी, जो पहले नहीं दिखाई दी थी ...
SND

3

एक अन्य सुझाव यह जांचने के लिए है कि आप ऑटो-जेनरेट किए गए फ़ील्ड के लिए मान्य प्रकार का उपयोग करते हैं। याद रखें कि यह स्ट्रिंग के साथ काम नहीं करता है, लेकिन यह लंबे समय तक काम करता है:

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

@Constraints.Required
public String contents;

उपरोक्त सिंटैक्स ने JPA 2.0 प्रदाता के रूप में हाइबरनेट का उपयोग करके MySQL में टेबल बनाने के लिए काम किया।


स्ट्रिंग को लॉन्ग में बदलना मेरे लिए यह तय है। धन्यवाद
jlars62

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

समस्या का समाधान हो गया।

सूचना: प्राथमिक कुंजी को AUTO_INCREMENT पर सेट किया जाना चाहिए


2

बस नहीं-अशक्त बाधा जोड़ें

मुझे भी यही समस्या थी। मैंने अभी xml मैपिंग में नॉट-नाल की कमी को जोड़ा है। इसने काम कर दिया

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

2

हो सकता है कि तालिका स्कीमा के साथ यही समस्या है। तालिका ड्रॉप करें और एप्लिकेशन को फिर से चलाएँ।


1

ऊपर वर्णित के अलावा, इस उदाहरण में AUTO INCREMENT बनाने के लिए sql तालिका बनाते समय मत भूलना

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

कृपया जाँचें कि क्या विशेष रूप से तालिका में कॉलम आईडी के लिए डिफ़ॉल्ट मान है


0

मुझे भी यही समस्या थी। मैं एक जॉइन टेबल का उपयोग कर रहा था और मेरे पास एक पंक्ति आईडी फ़ील्ड और दो विदेशी कुंजियाँ थीं। मैं सटीक कारण नहीं जानता, लेकिन मैंने निम्नलिखित काम किया

  1. MySQL को समुदाय में 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

उसी अपवाद को फेंक दिया गया था अगर एक DB तालिका में एक पुराना अविकसित स्तंभ था।

उदाहरण के लिए: attribute_id NOT NULL BIGINT(20),औरattributeId NOT NULL BIGINT(20),

उपयोग नहीं की गई विशेषता को हटाने के बाद, मेरे मामले में contractId , समस्या हल हो गई थी।


0

यह मेरे साथ एक @ManyToManyरिश्ते के साथ हुआ । मैंने के साथ रिश्ते में से एक फ़ील्ड को एनोटेट किया था @JoinTable, मैंने उसे हटा दिया और mappedByइसके बजाय @ManyToMany पर विशेषता का उपयोग किया ।


क्या आप एक उदाहरण प्रदान कर सकते हैं?
Malena T

0

मैंने कोड की कोशिश की और मेरे मामले में नीचे दिए गए कोड से समस्या हल हो गई। मैंने स्कीमा ठीक से नहीं बसाया था

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

कृपया ,catalog="databasename" उसी तरह जोड़ने का प्रयास करें जैसा मैंने किया।

,catalog="databasename"

0

मेरे मामले में, मैंने उस अपमानजनक तालिकाओं और फ़ील्ड "आईडी" को बदल दिया है, इसलिए मैंने इसे AUTO_INCREMENT बना दिया है, मुझे अभी भी यह पता लगाने की आवश्यकता है कि तैनाती के समय यह "AUTO_INCREMENT" क्यों नहीं बना रहा है ताकि मुझे इसे स्वयं करना पड़े!


0

इस बारे में क्या:

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

मुझे उम्मीद है इससे आपको मदद मिली होगी।


0

Longऑब्जेक्ट प्रकार को longआदिम प्रकार में बदलने का प्रयास करें (यदि आदिम का उपयोग करना आपके लिए ठीक है)।

मुझे भी यही समस्या थी और बदलते प्रकार ने मेरी मदद की।


0

मेरे पास यह मुद्दा था, गलती से मैंने @Transientएनोटेशन को उस विशेष विशेषता के ऊपर रखा था । मेरे मामले में यह त्रुटि समझ में आती है।


0

"फ़ील्ड 'आईडी का डिफ़ॉल्ट मान नहीं है" क्योंकि आपने एनोटेशन GenerationType.IDENTITYमें घोषणा नहीं की थी GeneratedValue

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

0

यह समस्या इसलिए है क्योंकि कभी-कभी आपको डेटाबेस को फिर से अपडेट करने / बनाने की आवश्यकता होती है या कभी-कभी यदि आपने डीबी तालिका में फ़ील्ड को जोड़ा है, लेकिन इकाई वर्ग नहीं तो यह कोई शून्य मान या शून्य नहीं डाल सकता है इसलिए यह त्रुटि आई। इसलिए दोनों साइड की जांच करें। डीबी और एंटिटी क्लास।


0

जब आपका क्षेत्र अशक्त नहीं होता है, तो उसे टेबल निर्माण पर एक डिफ़ॉल्ट मान की आवश्यकता होती है। AUTO_INCREMENT की तालिका को अच्छी तरह से आरम्भ करने के लिए पुनः बनाएँ ताकि DB को डिफ़ॉल्ट मान की आवश्यकता न पड़े क्योंकि यह इसे स्वयं उत्पन्न करेगा और कभी भी NULL नहीं डालेगा।

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

जब मॉडल फ़ील्ड db में सही टेबल फ़ील्ड से मेल नहीं खाती, तो मुझे GCP क्लाउड sql में ऐसी त्रुटि मिली है। उदाहरण: जब मॉडल फ़ील्ड fieldName
तालिका में db की होनी चाहिए, तो फ़ील्ड field_name फिक्सिंग तालिका फ़ील्ड नाम ने मेरी मदद की है।


-1

hashCode()अपने एंटिटी बीन क्लास के लिए एक विधि जोड़ें और इसे पुन: प्रयास करें


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