Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hibernate & GenerationType.IDENTITY 
V
    Опции темы
_sten_
  Дата 19.2.2010, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



Есть ентити класс и замаплен:
Код

@Entity
@Table(name = "item")
public class Item {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

        // getters and setters here

}


для генирации ид используется GenerationType.IDENTITY стратегия которая оначает что ид будет пропущен в инесерте(будет сгенерирован БД через значение по умолчанию)

вот DDL для таблички(PostgreSQL):
Код

create sequence item_id_seq;
CREATE TABLE item  ( 
    id int4 NOT NULL DEFAULT nextval('item_id_seq'),
    name varchar(255),
    PRIMARY KEY(id)
);


сохраняем ентити с помощью хибернета:
Код

        Item item = new Item();
        item.setName("test");
        Session session = sessionFactory.openSession();
        session.save(item);
        System.out.println("id: " + item.getId());

вот все что пишет хибернет:
Код

    insert 
    into
        item
        (name) 
    values
        (?)

(без ид)

не понятно как хибернет узнает ид в последней строке... ведь ид было сгенерено базой(через сиквесн) без использования хибернета, и хибернет ни писал никаких селектов бля определения ид...

Это сообщение отредактировал(а) _sten_ - 19.2.2010, 21:04
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
MaxPayneC
Дата 19.2.2010, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Интересный вопрос. Возможно, прозвучит глупо, но все же спрошу - System.out.println("id: " + item.getId()); действительно выводит id созданной записи? Если да, тогда посмотрите консоль, не было ли селекта.
PM   Вверх
_sten_
Дата 19.2.2010, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



да, действительно System.out.println("id: " + item.getId()); выводит ид.
из доки по Session интерфейсу:
Цитата

    Persist the given transient instance, first assigning a generated identifier. (Or using the current value of the identifier property if the assigned  generator is used.) This operation cascades to associated instances if the association is mapped with cascade="save-update".

    Parameters:
        object - a transient instance of a persistent class 
    Returns:
        the generated identifier 
    Throws:
        HibernateException


тоесть можно сделать и так:
Код

Long id = (Long) session.save(item);
System.out.println("id: " + id);


все что есть на консоли указано выше.
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
MaxPayneC
Дата 19.2.2010, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Все, что мне удалось найти на этот счет - это
Цитата

You can retrieve the most recent AUTO_INCREMENT value with the LAST_INSERT_ID() SQL function or the mysql_insert_id() C API function. These functions are connection-specific, so their return values are not affected by another connection which is also performing inserts.

Видимо hibernate вызывает эти функции.
PM   Вверх
jk1
Дата 19.2.2010, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Может быть, дело в этом:
Цитата

For identifier generators that store values in the database, it is inefficient for them to hit the database on each and every call to generate a new identifier value. Instead, you can group a bunch of them in memory and only hit the database when you have exhausted your in-memory value group. This is the role of the pluggable optimizers. 
1) hilo: applies a hi/lo algorithm around the database retrieved values. The values from the database for this optimizer are expected to be sequential. The values retrieved from the database structure for this optimizer indicates the "group number". The increment_size is multiplied by that value in memory to define a group "hi value".
2) pooled: as with the case of hilo, this optimizer attempts to minimize the number of hits to the database. Here, however, we simply store the starting value for the "next group" into the database structure rather than a sequential value in combination with an in-memory grouping algorithm. Here, increment_size refers to the values coming from the database.

Более подробная документация


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
_sten_
Дата 19.2.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



продебажил выяснил что хибернет пишет:
Код

insert into item (name) values ('test') RETURNING * 


типа инсерт и селект вместе)))
терь все стало на свои места

осталось только выяснить входит ли этот RETURNING в стандарт SQL или это чисто фишка Postgre
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
MaxPayneC
Дата 19.2.2010, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Цитата
Может быть, дело в этом:

Маловероятно, я три раза запускал тест, а перед третьим запуском поменял авто_инкремент на 100.

Это сообщение отредактировал(а) MaxPayneC - 19.2.2010, 23:08
PM   Вверх
_sten_
Дата 19.2.2010, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



кто то что знает об этом RETURNING? что то не могу ничего нагуглить...

Добавлено через 8 минут и 22 секунды
вот нашел:
Цитата

INSERT conforms to the SQL standard, except that the RETURNING clause is a PostgreSQL extension. Also, the case in which a column name list is omitted, but not all the columns are filled from the VALUES clause or query, is disallowed by the standard. 

значит RETURNING - это фишка чисто постгри

интересно как хибернет решает эту проблему с другими СУБД
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
MaxPayneC
Дата 19.2.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Цитата(_sten_ @  19.2.2010,  23:10 Найти цитируемый пост)

интересно как хибернет решает эту проблему с другими СУБД 

Встроенными средствами СУБД. В случае например MySQL - это мой пред-предыдущий пост, в случае Oracle если я не ошибаюсь, тоже RETURNING.
PM   Вверх
jk1
Дата 19.2.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 5
Всего: 75



Цитата

For versions up to and including 11g Release 1, Oracle doesn't support RETURNING construct.

http://www.oracle-developer.net/display.php?id=413

Экспериментально выяснилось, что как минимум 11.1.0.6.0 эту конструкцию поддерживает


Это сообщение отредактировал(а) jk1 - 24.2.2010, 16:33


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
_sten_
Дата 19.2.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



спасибо, проблема решена
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0555 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.