2016-06-21 5 views
1

Я работаю над проектом, где я использую hibernate для выполнения операций CRUD. У меня есть модель пользователя, и я пытаюсь вставить информацию, но сохраняющий получаю эту ошибку(Hibernate Oracle не может вставить NULL) Как вставить автоматически сгенерированный идентификатор?

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"); 

Я под впечатление, что спящий режим будет автоматически генерировать идентификатор для меня и вставить их с использованием последовательности

+0

Какую версию Oracle вы используете? –

+0

Я использую oracle 11g – user3342812

+0

Если вы хотите использовать последовательность для генерации id, вам нужно настроить это в своей аннотации (GenerationType.SEQUENCE). Oracle не поддерживает столбцы идентификации, поэтому ваша текущая конфигурация генерации идентификатора не влияет. – dunni

ответ

3

Некоторые ошибки:

  • Используйте правильный диалект: org.hibernate.dialect.Oracle10gDialect (без определенного диалекта для 11g).
  • не использует примитивный тип для спящего режима сгенерированного идентификатора (использование Integer, а не int)

IDENTITY для генерации ID поддерживается оракулом только с version 12c

Вы должны использовать другую стратегию, как с помощью последовательности для пример.

отображение будет выглядеть следующим образом:

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

спасибо thierry :) – user3342812

0

Вам необходимо создать таблицу APPUSER так, чтобы ее первичный ключ ID имел функцию автоматического увеличения. Пожалуйста, перейдите по ссылке How to create id with AUTO_INCREMENT on Oracle? о том, как это сделать. Только тогда вы увидите, что спящий режим будет вставлять значение в поле первичного ключа для вас.

0

Я вижу, что вы нашли полезный ответ, но так как у меня была эта же проблема, и наткнулся на этот пост в поисках решения, я буду включать то, что работал меня. Я использую Oracle 12c - и это будет ТОЛЬКО работать с 12c - решение заключалось в том, чтобы изменить диалект на Oracle12cDialect. В противном случае просто используйте

@GeneratedValue(strategy = GenerationType.IDENTITY) 

работал.

 Смежные вопросы

  • Нет связанных вопросов^_^