【问题标题】:Allow ID = 0 with Hibernate ("eclipselink.id-validation" = "NULL" equivalent)允许 ID = 0 与 Hibernate(“eclipselink.id-validation”=“NULL”等效)
【发布时间】:2018-07-09 09:33:06
【问题描述】:

我正在使用带有 springboot 1.5.14 的休眠 5.0.12。

我的实体有这个 id

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "UserID", nullable = true)
public int getUserId() {
    return this.userId;
}

public void setUserId(int userId) {
    this.userId = userId;
}

在我的数据库中有id = 0 的礼物记录。

如果我读取、编辑和保存这些记录,hibernate 会使用生成的新 ID 复制这些记录。

如何配置休眠以允许id = 0 值?

在 eclispelink 中这个配置是"eclipselink.id-validation" = "NULL"

【问题讨论】:

    标签: java hibernate identity


    【解决方案1】:

    解决方法是将主键类型声明为 Integer 而不是 int。

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "UserID", nullable = true)
    public Integer getUserId() {
        return this.userId;
    }
    
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    

    【讨论】:

      【解决方案2】:

      您应该编辑数据库而不是休眠配置,尽管这是一种不好的做法。

      I want id to start from 0,but starts from 1

      【讨论】:

      • 这不是我的要求。 db 已经接受 0 值。该值已存在记录。
      【解决方案3】:

      这个问题应该是与数据库相关的,因为即使您为 Long/Int 主键显式设置零值,数据库通常也会“更正”您的输入(由于默认的方式设置在大多数数据库中设置)。

      即对于 MySQL,您可以将 ID 显式设置为零 (0),但数据库仍将忽略它,除非您为 sql_mode 添加/设置 NO_AUTO_VALUE_ON_ZERO。 如果 MySQL/MariaDB 是这种情况,您可以直接在 my.cnf 文件中更改此设置,如果您不想重置数据库,则需要通过 set global sql_mode='NO_AUTO_VALUE_ON_ZERO' 设置它

      我认为这个答案是相关的,因为您使用 @GeneratedValue(strategy=GenerationType.IDENTITY)

      【讨论】:

      • 我的数据库是 SAP SQL Anywhere 17。默认情况下,它允许自动增量字段为零值。在我的数据库中,自动增量仅计算空值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2017-06-21
      • 1970-01-01
      • 2022-12-22
      • 1970-01-01
      相关资源
      最近更新 更多