Подтвердить что ты не робот

Hibernate, id, oracle, последовательность

Моя база данных - это 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)

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

4b9b3361

Ответ 1

У меня также был проект, где Oracle DB, которая предоставляет данные моим классам @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 нет вызова триггера, потому что триггер управляется БД. Я помню, что мне приходилось иметь последовательность и триггер одновременно в БД, если я не хотел иметь проблемы. Триггер спросил, является ли id строки для вставки нулевым или = 0. В этом случае вызывается последовательность LOG_SEQ.

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