Использование последовательности в MySQL и Hibernate - PullRequest
4 голосов
/ 16 февраля 2011

Я работаю над проектом, который использует Hibernate и MySQL.Я намерен использовать последовательность для генерации идентификатора для всех таблиц в базе данных.(Трудно описать мой вопрос, поэтому я покажу вам в качестве примера).

Например: у меня есть 2 таблицы A и B. Во-первых, я добавляю 10 записей в таблицу A, и их идентификаторы будут от 1 до 10 .Затем я вставляю 10 записей в таблицу B и хочу, чтобы их идентификаторы были 11-20 , а не 1-10.Это означает, что сгенерированное значение идентификатора будет учитываться всеми записями во всех таблицах в базах данных, а не в одной таблице.

Так как же использовать эту концепцию в MySQL?Объявить и синтаксис?В Hibernate, как я могу использовать стратегию и генератор для модели данных, чтобы применить эту сгенерированную стратегию в базе данных?Большое вам спасибо!

1 Ответ

4 голосов
/ 16 февраля 2011

У вас нет последовательностей в Mysql, но вы можете использовать генерацию идентификатора 'TABLE'

@javax.persistence.TableGenerator(
    name="EMP_GEN",
    table="GENERATOR_TABLE",
    pkColumnName = "key",
    valueColumnName = "hi"
    pkColumnValue="EMP",
    allocationSize=20
)

@Entity
public class Klass {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator=EMP_GEN)
    @Column(name = "ID")
    private Long id;
}

Возможно, вам понадобится добавить фрагмент @javax.persistence.TableGenerator [...] во все ваши объекты

Редактировать

Спасибо большое. Но есть ли у нас другой способ использовать этот фрагмент, не добавляя его к каждой сущности? И когда я создаю таблицы в базе данных, как я могу объявить столбец первичного ключа ID для СУБД, чтобы автоматически сгенерировать это значение? - наполеонит76

К сожалению, я не знаю элегантного способа сделать это :(. В моем проекте мы используем последовательность в нескольких сущностях, и нам нужно объявить последовательность в каждом классе. Одна вещь, которую вы можете попробовать (но мне не очень нравится), это создать суперкласс для всех ваших сущностей, и этот суперкласс содержит только поле идентификатора и аннотации. У меня такое чувство, что я видел это в проекте, но я не уверен на 100%.

О том, чтобы сказать БД об использовании этой стратегии, я не думаю, что это действительно возможно. Вы можете попробовать добавить триггер и применить его к каждой таблице в схеме. Триггер сработает, когда вы вставите новую строку в таблицу, выберете значение из таблицы генератора и добавите его в строку. Честно говоря, я не знаю, может ли это сработать, и я на 99% уверен, что это не сработает, если у вас есть 2 одновременных сеанса, создающих строки.

Можете ли вы переосмыслить свою стратегию и использовать обычные столбцы автоинкремента для идентификаторов и поместить порядковый номер в другой столбец ваших таблиц?

...