【问题标题】:Hibernate @GeneratedValue doesn't generate the Primary key before persisting the entityHibernate @GeneratedValue 在持久化实体之前不会生成主键
【发布时间】:2011-12-23 13:18:30
【问题描述】:

我已经使用 Hibernate(默认)一个 ORM 提供程序创建了一个接缝应用程序。在持久化实体时,它会引发以下错误:

Caused by: java.sql.SQLException: Field 'COUNTRY_ID' doesn't have a default value
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

它被抛出是因为主键不是在持久化实体之前由 Hibernate 生成的。

@Entity
@Table(name = "country")
public class Country implements java.io.Serializable {

private Integer countryId;
//other instance variables...

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "COUNTRY_ID", unique = true, nullable = false)
public Integer getCountryId() {
return this.countryId;
}

public void setCountryId(Integer countryId) {
this.countryId = countryId;
}

当我在 'Country' 表中进行更改时,即将 COUNTRY.COUNTRY_ID 设置为 AUTO_INCREMENT(MySQL 数据库),那么上面的代码会保留 Country 实体。即使尝试了策略

@GeneratedValue(strategy = GenerationType.IDENTITY)

如果我不将 COUNTRY_ID 设为 AUTO_INCREMENT,则会发生错误。

那么,表中的主键是否需要自动递增?如果主键在数据库表中没有标记为 AUTO_INCREMENT,为什么 Hibernate 在持久化实体之前不创建唯一主键(使用 HiLo 算法)。

提前致谢。

问候

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    GenerationType.AUTO 表示hibernate会根据数据库的能力来选择一种生成策略:对于MySQL来说会选择identity策略。在您的情况下,指定 GenerationType.AUTO 与 GenerationType.IDENTITY 相同。

    反过来,GenerationType.IDENTITY 需要在您的 id 列上有一个自动增量。

    如果您希望 hibernate 为您的 id 列分配值,您应该尝试其他策略:例如 hilo.但建议让 hibernate 为您的 id 列分配值仅用于测试。

    【讨论】:

    • 感谢您的意见。因此,Hibernate (GenerationType.AUTO) 选择 MySQL 的生成策略为 GenerationType.IDENTITY,我们需要对 id 列进行自动增量。但是,随着应用程序的增长,GenerationType.IDENTITY 的性能相对较低。哪个是 MySQL 数据库的最佳策略?
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    相关资源
    最近更新 更多