(Hibernate Oracle无法插入NULL)如何插入自动生成的ID?

时间:2016-06-21 06:25:58

标签: java oracle hibernate orm hibernate-mapping

我正在使用hibernate执行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并使用序列

插入它们

3 个答案:

答案 0 :(得分:5)

一些错误:

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

以来,oracle仅支持用于ID生成的

IDENTITY

您应该使用其他策略,例如使用序列。

映射看起来像:

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

答案 1 :(得分:1)

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

@GeneratedValue(strategy = GenerationType.IDENTITY)

的工作。

答案 2 :(得分:0)

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