2014-09-30 5 views
3

У меня есть некоторый код@Id в спящем режиме

@Entity 
@Table(name = "USER") 
public class User { 

    @Id 
    @Column(name = "id", nullable = false, unique = true) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

Когда я пытаюсь добавить пользователя в таблицу, я ловлю

org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID"; SQL statement: 
insert into USER (id, birthday, email, first_name, last_name, login, password, id_role) values (null, ?, ?, ?, ?, ?, ?, ?) [23502-181] 

Это мой код, чтобы добавить пользователя в БД

stock2.setBirthday(new Date(46)); 
stock2.setEmail("sss"); 
stock2.setFirstName("oleg"); 
stock2.setId(506l); 
stock2.setLastName("gubov"); 
stock2.setLogin("OP"); 
stock2.setPassword("1"); 
Role role2 = new Role(); 
role2.setName("poil"); 
role2.setId(7l); 
stock2.setRole(role2); 

HibernateUserDao dao = new HibernateUserDao(); 
System.out.println(stock2.getId() + " -----------before"); 
dao.create(stock2); 

и код объекта:

public void create(User user) { 

    Session session = null; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     session.beginTransaction(); 
     session.save(user); 
     session.getTransaction().commit(); 
    } catch (Exception e) { 
     session.getTransaction().rollback(); 
     throw e; 
    } finally { 
     if (session != null && session.isOpen()) { 
      session.close(); 
     } 
    } 
} 

На мой взгляд, идентификатор равен 7, но не NULL. И «ява» думает иначе. Где может быть проблема?

+0

Во-первых, я полагаю, что в вашем блоке кода отсутствует следующая строка: 'User stock2 = new User();'. Это приведет к тому, что идентификатор, который вы ожидаете, равен 506, а не 7 (из-за 'stock2.setId (506l);'). Правильно ли это? – cooltea

ответ

2

Вы называете dao.create(), поэтому ваше намерение состоит в том, чтобы вставить строку в базу данных. Почему вы используете GenerationType.IDENTITY, вставляя свой собственный id?

GenerationType.IDENTITY означает, что ваш JPA Provider будет использовать IDENTITY столбца таблицы (это так, то id будет назначен на стороне Databse). Hibernate, зная, что не отправит ваш id в SQL-запрос.

Кстати, это не лучший вариант для создания идентификаторов. GenerationType.IDENTITY имеет некоторые проблемы с производительностью (он не поддерживает предварительное выделение, и JPA Provider может сделать запрос SELECT после каждой вставленной строки, просто чтобы узнать, что создало id).

Чтобы иметь возможность вставить свои собственные ценности, как id S вы можете просто удалить @GeneratedValue (который де-факто означает, что вы хотите id s будет генерироваться автоматически) аннотацию.

0

Пользователь зарезервированное ключевое слово в большинстве СУБД, поэтому изменить:

@Table(name = "USER") 

в

@Table(name = "APP_USER") 
0

Вот ссылка с описанием вашей проблемы и предложить возможные решения: http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Common_Problems_4

Выдержка:

нуля вставляются в базу данных, или ошибка при вставке.

[...] Возможно, вы также не указали, что ваш столбец первичного ключа в вашей таблице является типом идентификации.

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