【问题标题】:( Hibernate Oracle cannot insert NULL ) How to insert auto generated ID?(Hibernate Oracle 无法插入 NULL)如何插入自动生成的 ID?
【发布时间】:2016-10-22 13:29:05
【问题描述】:

我正在使用休眠执行 CRUD 操作的项目。我有用户模型,我正在尝试插入信息但不断收到此错误

Hibernate: insert into APPUSER (dob, email, firstName, lastName, password) values (?, ?, ?, ?, ?)
Jun 21, 2016 2:17:07 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1400, SQLState: 23000
Jun 21, 2016 2:17:07 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: ORA-01400: cannot insert NULL into ("MYAPP8785"."APPUSER"."ID")

用户模型看起来像

@Entity
@Table(name="APPUSER")
public class AppUser {


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

    @Email
    @Size(max = 50)
    private String email;

    @Column
    private String dob;

    @Column
    private String firstName;

    @Column
    private String lastName;

    @Column(name = "password", nullable = false)
    private String password;
}

Hibernate 属性,如

properties.put("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
//properties.put("hibernate.current_session_context_class","thread");
properties.put("hibernate.hbm2ddl.auto","update");
properties.put("hibernate.show_sql","true");

我的印象是 hibernate 会自动为我生成 id 并使用序列插入它们

【问题讨论】:

  • 您使用的是什么版本的 Oracle?
  • 我使用的是 oracle 11g
  • 如果你想使用一个序列来生成 id,你必须在你的注解中配置它 (GenerationType.SEQUENCE)。 Oracle 不支持标识列,因此您当前的 id 生成配置无效。
  • 另外,将 MySQLDialect 与 Oracle 一起使用没有什么意义。使用适当的方言。

标签: java oracle hibernate orm hibernate-mapping


【解决方案1】:

一些错误:

  • 使用正确的方言:org.hibernate.dialect.Oracle10gDialect(11g 没有特定方言)。
  • 不要对休眠生成的 ID 使用原始类型(使用 Integer,而不是 int

IDENTITY 用于 ID 生成仅在 version 12c 之后由 oracle 支持

您应该使用另一种策略,例如使用序列。

映射看起来像:

@Id
@SequenceGenerator(name = "generator", sequenceName = "ID_SEQUENCE", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
@Column(name = "ID")
private Integer id;

【讨论】:

    【解决方案2】:

    我看到您找到了一个可用的答案,但是由于我遇到了同样的问题并且在寻找解决方案时遇到了这篇文章,所以我将包括对我有用的内容。我正在使用 Oracle 12c - 这仅适用于 12c - 解决方案是将方言更改为 Oracle12cDialect。否则,只需使用

    @GeneratedValue(strategy = GenerationType.IDENTITY)
    

    工作。

    【讨论】:

      【解决方案3】:

      您需要创建表APPUSER,使其主键ID 具有自动递增功能。请点击链接How to create id with AUTO_INCREMENT on Oracle? 了解如何操作。只有这样,您才会看到 hibernate 会为您在主键字段中插入值。

      【讨论】:

        猜你喜欢
        • 2011-11-18
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-10
        • 2016-12-23
        • 1970-01-01
        • 2011-08-23
        相关资源
        最近更新 更多