Генерация первичного ключа, уникального для нескольких таблиц - PullRequest
2 голосов
/ 24 декабря 2011

Я работаю над ресторанным приложением, использующим Hibernate. У меня есть несколько объектов, таких как пицца, напитки, макароны и т. Д.

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

Есть идеи, как это сделать, ребята?

Я бы предпочел решение, использующее аннотации Hibernate. : - |

Ответы [ 4 ]

3 голосов
/ 24 декабря 2011

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

2 голосов
/ 24 декабря 2011

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

Вы можете посмотреть в разделе 5.1.6 документации ядра Hibernate о том, как реализовать различные стратегии отображения модуля OO в таблицу или несколько таблиц. Обратите внимание, что таблица для каждого класса стратегии и 10.1.5. Таблица для каждого конкретного класса даст вам ваши текущие настройки таблицы, но вы должны быть в состоянии сгенерировать ключ, который вы сидели MySQL не может сделать легко. Однако, я думаю, вы обнаружите, что есть общие свойства, которые должны быть в базовом классе, и поэтому потребуется другая форма отображения, и вы получите таблицу пунктов меню, которая может легко иметь сгенерированный идентификатор.

2 голосов
/ 24 декабря 2011

UUID будет уникальным для всех таблиц, но вы не сможете определить, какая таблица основана только на идентификаторе.

Если честно, это немного странное требование.Но если вы действительно настаиваете на этом, вы можете просто добавить префикс имени таблицы / сущности к первичному ключу.Для этого вам понадобится собственный генератор.См. этот вопрос .

Вы можете использовать наследование.Имейте базовую сущность @MappedSuperclass Item, со стратегией @Inheritance, установленной на таблицу для класса, а затем Pasta, Pizza.Если поля не сильно отличаются, вы используете даже одну таблицу со столбцом дискриминатора.И если ваши типы сущностей, вероятно, будут расти, вы можете просто иметь один Item со столбцом type

0 голосов
/ 24 декабря 2011

Я согласен с Марком, похоже, что таблица в подклассе будет соответствовать вашему дизайну и должна иметь идентификатор для нескольких элементов. Также обратите внимание, что размещение ваших элементов в нескольких таблицах без общей родительской таблицы может привести к некоторым проблемам, когда вам нужен FK для этих элементов.

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