Спящий режим: описание работы @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 определить, какой тип генератора использовать, ваш код переносится между различными базами данных.