2015-11-24 2 views
1

Предположим, что у меня есть таблица с только два столбца ID и автомобиль, и колонна автомобилей может иметь повторяющиеся значения, например:спящий режим автоматической генерации второй идентификатор

id | car 

1 | 200 

2 | 200 

3 | 201 

4 | 201 

5 | 201 

6 | 202 

мне нужен новый столбец, который автоматически генерирует второй идентификатор сгруппированных по Cars, когда новые записи вставляются, то, что выглядит следующим образом:

id | car | second_id 

1 | 200 | 1 

2 | 200 | 2 

3 | 201 | 1 

4 | 201 | 2 

5 | 201 | 3 

6 | 202 | 1 

Я пытался что-то подобное, но не работает:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private int id; 

@Column(name = "car") 
private int car; 

@GeneratedValue(generator="second_id") 
@GenericGenerator(name="second_id", strategy="com.example.SecondIdGenerator") 
@Column(name = "second_id", unique = false, nullable = false, length = 20) 
private int secondId; 

Класс SecondIdGenerator теперь возвращает только фиксированное значение для теста, но это значение не отображается в db, другими словами, оно не работает.

Как я это делаю? У Hibernate есть что-то для этого?

(я использую MySQL БД)

+0

Вопрос: можно ли изменить стоимость автомобиля (обновить запрос) после создания? Если это так, я думаю, нам нужно будет пересчитать второй идентификатор, верно? – Bruno

+1

@Bruno Нет! Стоимость автомобиля не может быть изменена! – cbed

+0

Вы не говорите нам, какую проблему вы действительно пытаетесь решить. Вы можете попробовать задать отдельный вопрос с вопросом, который привел вас к этому вопросу. – Rob

ответ

0

Я не знаю какой-либо инструмент поддержки для такого рода колонки.

Вы можете реализовать вычисление значения для столбца second_id с помощью триггера. Вероятно, вам понадобится триггер «перед вставкой». Триггер обнаружит существующий максимум second_id для вставленного автомобиля и добавит его для значения second_id новой строки. Если вы разрешаете обновление столбца автомобиля, вы можете поддерживать пересчет столбца second_id одинаковым образом (хотя это оставило бы отверстия в последовательности second_id для столбца second_id предыдущего автомобиля).

Возможно, вам будет проще создать хранимую процедуру, которая инкапсулирует бизнес-логику, если вы собираетесь иметь несколько триггеров, поддерживающих значение столбца.

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

+0

Я понимаю, но могу ли я сделать это с помощью Hibernate? Возможно, используя @GeneratedValue без @Id? – cbed

+0

Hibernate не имеет возможности сделать это автоматически. – Rob

0

во время выполнения, если нет указанного указанного hibernate @Id, вы получите исключение, я думаю, вы можете изменить структуру своей таблицы.

Смежные вопросы