سؤال

أنا أواجه ما أعتقد أنها مشكلة بسيطة مع السبات, ولكن لا يمكن حلها (السبات المنتديات يجري إليه لا يساعد بالتأكيد).

لدي فئة بسيطة أود أن تستمر, ولكن يبقى الحصول على:

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) لا حل لها

حلها: إعادة إنشاء قاعدة بيانات تحل المشكلة

هل كانت مفيدة؟

المحلول

في بعض الأحيان تغييرات على نموذج أو ORM قد لا تعكس بدقة على قاعدة البيانات حتى بعد تنفيذ SchemaUpdate.

إذا كان الخطأ في الواقع يبدو أن عدم تفسير معقول ، حاول إعادة إنشاء قاعدة البيانات (أو على الأقل إنشاء واحدة جديدة) و السقالات مع SchemaExport.

نصائح أخرى

إذا كنت تريد الخلية تنتج تلقائيا المفاتيح الأساسية ثم عليك أن تقول ذلك عند إنشاء الجدول.لم يكن لديك للقيام بذلك في أوراكل.

على المفتاح الأساسي يجب أن تشمل 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;
  }

}

يجب استخدام التحديث في hbm2ddl الملكية.إجراء التغييرات وتحديث لخلق بحيث يمكن إنشاء الجدول.

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

عملت بالنسبة لي.

نلقي نظرة على GeneratedValue's الاستراتيجية.عادة ما تبدو شيئا مثل:

@GeneratedValue(strategy=GenerationType.IDENTITY)

اقتراح آخر هو للتأكد من أن كنت تستخدم صالحة نوع تلقائي المجال.تذكر أنه لا يعمل مع سلسلة, لكنه يعمل مع طويلة:

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

@Constraints.Required
public String contents;

سبق جملة عملت على توليد الجداول في MySQL باستخدام السبات كما JPA 2.0 مزود.

كان عندي نفس المشكلة.لقد وجدت البرنامج التعليمي السبات واحد-إلى-واحد رسم الخرائط على سبيل المثال استخدام المفاتيح الخارجية الشرح وأعقب ذلك خطوة خطوة مثل أدناه:

إنشاء جدول قاعدة البيانات مع هذا البرنامج النصي:

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

لقد جئت إلى هنا بسبب رسالة الخطأ اتضح لدي جدولين مع نفس الاسم.

فقط إضافة غير-null القيد

كان عندي نفس المشكلة.أنا فقط واضاف غير-null القيد في تعيين xml. عملت

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

إسقاط الجدول من قاعدة البيانات يدويا ثم إعادة تشغيل التطبيق عملت بالنسبة لي.في حالتي الجدول لم يتم إنشاء بشكل صحيح(مع القيود) أعتقد.

كان لي هذه المشكلة.كان خطأي أنني قد وضعت insertable و قابلة للتحديث فيليدس كاذبة و كان يحاول تعيين الحقل في الطلب.هذا المجال هو مجموعة غير فارغة في ديسيبل.

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

في وقت لاحق غيرته إلى insertable = true, قابل للتحديث = true

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

انها عملت تماما في وقت لاحق.

يرجى التحقق من ما إذا كانت قيمة افتراضية عمود معرف في الجدول.إن لم يكن جعله الافتراضي

كان عندي نفس المشكلة.كنت باستخدام الانضمام إلى الجدول و كل ما كان مع صف حقل معرف واثنين من مفاتيح خارجية.أنا لا أعرف بالضبط سبب ولكن لم التالية

  1. ترقية الخلية إلى المجتمع 5.5.13
  2. إعادة تسمية فئة الجدول
  3. تأكد من كنت قد hashcode و يساوي أساليب

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

نفسه تم طرح استثناء إذا DB كان الجدول القديم unremoved العمود.

على سبيل المثال:attribute_id NOT NULL BIGINT(20), و attributeId NOT NULL BIGINT(20),

بعد إزالة غير المستخدمة السمة ، في حالتي contractId, المشكلة تم حلها.

هذا ما حدث لي مع @ManyToMany علاقة.كان المشروح أحد الحقول في العلاقة مع @JoinTable, لقد تمت إزالة هذا و تستخدم mappedBy السمة على @ManyToMany بدلا من ذلك.

بالإضافة إلى ما ذكر أعلاه ، لا تنسى أثناء إنشاء جدول 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
);

حاولت رمز في حالتي رمز أدناه في حل المشكلة.أنا لم استقر المخطط بشكل صحيح

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

يرجى محاولة إضافة ,catalog="databasename" مثل ما فعلت أنا.

,catalog="databasename"

في حالتي ، أنا غيرت هذا المخالف الجداول الحقل "معرف" في السؤال أنا جعلت AUTO_INCREMENT, أنا لا تزال بحاجة إلى معرفة السبب في نشر ذلك الوقت كان لا يجعل من "AUTO_INCREMENT" بحيث يجب أن أفعل ذلك بنفسي!

ماذا عن هذا:

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

وآمل أن يساعد أنت.

ربما هذه هي المشكلة مع الجدول المخطط. إسقاط الجدول و أعد تشغيل التطبيق.

محاولة تغيير Long نوع كائن إلى long نوع بدائي (إذا باستخدام الأوليات على ما يرام بالنسبة لك).

كان عندي نفس المشكلة و تغيير نوع ساعدني.

كان لي هذه المشكلة عن طريق الخطأ كنت قد وضعت @Transient الشرح أعلاه خاصة السمة.في حالتي هذا الخطأ المنطقي.

إضافة أسلوب hashCode() إلى كيان الطبقة الفاصوليا و إعادة المحاولة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top