hibernate:“字段ID”没有默认值“

我面对的是我认为是Hibernate的一个简单问题,但无法解决它(Hibernate论坛无法访问肯定不会帮助)。

我有一个简单的类,我想坚持,但不断得到:

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)不解决它

解决:重新创build数据库解决了这个问题

即使在执行SchemaUpdate之后,对模型或ORM所做的更改也可能无法准确反映到数据库中。

如果错误实际上似乎缺乏明智的解释,请尝试重新创build数据库(或者至less创build一个新数据库),并使用SchemaExport对其进行SchemaExport

如果您希望MySQL自动生成主键,那么在创build表时必须告诉它。 你不必在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; } } 

看看GeneratedValue的战略。 它通常看起来像这样:

 @GeneratedValue(strategy=GenerationType.IDENTITY) 

您必须在您的hbm2ddl属性中使用更新。 进行更改并将其更新为Create,以便可以创build表。

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

它为我工作。

另一个build议是检查您使用自动生成的字段的有效types。 请记住它不适用于String,但它适用于Long:

 @Id @GeneratedValue(strategy=GenerationType.AUTO) public Long id; @Constraints.Required public String contents; 

上面的语法用于在MySQL中使用Hibernate作为JPA 2.0提供程序生成表。

我来到这里是因为错误信息,事实certificate我有两个同名的表。

只需添加非空约束

我有同样的问题。 我只是在xml映射中添加了非null约束。 有效

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

我有同样的问题。 我find了使用外键注释的教程Hibernate一对一映射示例,并按照如下步骤一步一步地执行:

用这个脚本创build数据库表:

 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

请检查特定table.if列id的默认值是否不作为默认值

我有同样的问题。 我正在使用一个连接表,所有我有一个行ID字段和两个外键。 我不知道确切的原因,但我做了以下

  1. 升级MySQL到社区5.5.13
  2. 重命名类和表
  3. 确保我有hashcode和equals方法

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

如果数据库表有一个旧的未被删除的列,则会抛出同样的exception。

例如: attribute_id NOT NULL BIGINT(20),attributeId NOT NULL BIGINT(20),

删除未使用的属性,在我的情况下contractId ,问题已解决。

我有这个问题,我错误地把@Transient注释放在那个特定的属性上面。 在我的情况下这个错误是有道理的。

这发生在我身上@ManyToMany关系。 我注释了与@JoinTable关系中的一个字段,我删除了这个,并使用了@ManyToMany上的mappedBy属性。

将一个方法hashCode()添加到您的实体Bean类并重试