Hibernate, идентификатор, оракул, последовательность - PullRequest
12 голосов
/ 16 марта 2011

Моя база данных - Oracle, а значением моего столбца id является последовательность Oracle, эта последовательность выполняется триггером, поэтому перед каждой строкой этот триггер использует эту последовательность для получения значения id. Поэтому я не совсем понимаю, какую генерацию стратегии идентификатора мне следует определить в своем классе сущностей.

@GenericGenerator(name = "generator", strategy = "increment")
@Id
@GeneratedValue(generator = "generator")

или

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "idGenerator")
@SequenceGenerator(name="idGenerator", sequenceName="ID_SEQ")

или

@Id
@GeneratedValue(strategy = GenerationType.AUTO)

Действительно смущен, может кто-нибудь пролить свет на эту тему? Пожалуйста, объясните четко ..

1 Ответ

8 голосов
/ 17 марта 2011

У меня был также проект, где БД Oracle, которая предоставляет данные для моих классов @Entity.Как вы сказали, последовательность генерирует идентификатор PK таблицы через триггер.Это были аннотации, которые я использовал в одном из этих классов:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "G1")
@SequenceGenerator(name = "G1", sequenceName = "LOG_SEQ")
@Column(name = "ID", unique = true, nullable = false, precision = 22, scale = 0)
public int getId() {
    return this.id;
}

Это второй синтаксис, который вы показали в своем посте.В коде Java нет вызова триггера, потому что триггер управляется БД.Я помню, что мне нужно было иметь последовательность и триггер одновременно в БД, если я не хотел проблем.Триггер спрашивает, является ли идентификатор строки для вставки нулевым или = 0. В этом случае вызывается последовательность LOG_SEQ.

Таким образом, если вы предоставите значение @Id вашей сущности, оно может быть вставлено в БД (если этот Id не существует) и последовательность не будет вызвана.Попробуйте увидеть код триггера, чтобы увидеть, что именно происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...