Спящий режим: описание работы @GeneratedValue
Мне сложно найти точное объяснение @GeneratedValue и различные стратегии относительно того, что происходит с точки зрения базы данных.
Будет ли всегда запрашиваться база данных и будет возвращено последнее значение? что произойдет, если два разных процесса (разные приложения Hibernate) будут одновременно получать доступ к одной и той же таблице? конкретно с автоматическими числовыми значениями и последовательностями
Ответы
Ответ 1
Я предполагаю, что вы ссылаетесь на JPA @GeneratedValue.
Аннотация @GeneratedValue
сообщает ORM, как определить значение этого поля.
Например:
@Id
@GeneratedValue(strategy=SEQUENCE, generator="CUST_SEQ")
@Column(name="CUST_ID")
public Long getId() { return id; }
Example 2:
@Id
@GeneratedValue(strategy=TABLE, generator="CUST_GEN")
@Column(name="CUST_ID")
Long id;
Ключевое значение для понимания состоит в том, что генерируемое значение имеет стратегию, а стратегия генерируемого значения определяет, что происходит. В приведенном выше примере стратегия генерации SEQUENCE означает, что ORM будет запрашивать базу данных для нового значения для последовательности при сохранении объекта в первый раз. Второй пример указывает стратегию генерации таблицы, которая означает, что ORM проведет проверку строки в таблице, чтобы определить значение id. В примере примера 2 данные о том, какая таблица используется, не отображаются, поскольку она ссылается на генератор с именем "CUST_GEN"
Типичные генераторы, с которыми вы столкнетесь.
- Идентификатор. После ввода в поле спросить столбец auto incerement для значения элемента
- Последовательность - значение происходит из последовательности db
- table - значение происходит из другой таблицы в базе данных
- auto - выберите один из указанных выше типов баз данных
- UUID - сгенерировать UUID перед выполнением вставки
Можно разработать собственный генератор. Взаимодействие с базой данных будет зависеть от стратегии генерации.
Ответ 2
Используйте ссылку http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/ для справки. Но если вы скажете, что конкретно вы ищете, я могу помочь вам лучше. Вот небольшая информация о аннотации @GeneratedValue... Мне нравится этот пост в блоге по той же теме http://elegando.jcg3.org/2009/08/hibernate-generatedvalue/. Он проделал хорошую работу, объясняя.
Ответ 3
если вы используете в своей сущности bean класс
@Id
@GeneratedValue
@Column(name="CUST_ID")
public Long getId() { return id; }
В этом случае Hibernate определит, какой тип первичного ключа будет сгенерирован, и зависит от того, какую базу данных вы используете.
По умолчанию аннотация @Id
автоматически определит наиболее подходящую стратегию генерации первичного ключа, которая будет использоваться, но вы можете отменить это, применив аннотацию @GeneratedValue
, которая принимает две стратегии и генератор параметров, которые я не собираюсь обсудите здесь, поэтому давайте использовать стандартную стратегию генерации ключевых слов по умолчанию. Если позволить Hibernate определить, какой тип генератора использовать, ваш код переносится между различными базами данных.