Как запросить UUID, хранящиеся в двоичном виде в базе данных (JPA / Hibernate / MySQL) - PullRequest
7 голосов
/ 08 июля 2011

У меня есть приложение на основе Java / JPA / Hibernate / MySQL. Я хочу использовать UUID для идентификации объекта, однако хочу убедиться, что производительность базы данных не пострадает.

Я нашел эту замечательную запись в блоге JPA и UUID Primary Keys , которая помогает мне в этом. Обратите внимание, как оптимизируется хранилище UUID, сохраняя его в двоичном виде (в отличие от строкового представления.

Это решает часть проблемы, потому что теперь мы можем эффективно вставлять объекты в базу данных.

Однако теперь у меня есть проблема, когда я хочу сделать запрос из базы данных, используя EntityManager.createQuery. Возможно ли / желательно ли запросить двоичные данные? или я должен хранить строковый UUID вместе с двоичной версией для облегчения запросов?

Ответы [ 3 ]

8 голосов
/ 26 мая 2012

Протестировано с Hibernate 4.1.2 и MySQL-Connector-J 5.1.18, вы можете определить поле UUID:

@Entity
class EntityType {
    @Column( columnDefinition = "BINARY(16)", length = 16 )
    private UUID id;
}

... и запросить экземпляр UUID:

UUID id = ....;
EntityType result = em.createQuery( 
   “SELECT x FROM EntityType x WHERE x.id = ?1″, EntityType.class )
   .setParameter( 1, id ).getSingleResult();
0 голосов
/ 09 июля 2011

Пока у вас уже есть идентификатор в двоичном формате, запросить его просто:

byte[] id = ....;
em.createQuery(“SELECT x FROM TableName x WHERE x.id = ?1″, TableName.class).setParameter(1, id).getSingleResult();

На самом деле, если вы просто смотрите по первичному ключу, вы можете использовать

em.find(TableName.class, id);

Получение идентификатора в двоичном формате может быть затруднительным, особенно если вам нужно передать его в URL-адресах и т. Д. Я рекомендую кодировать / декодировать Base64; В кодеке Apache Commons есть вспомогательные методы: от байта [] до строки, безопасной для URL, а затем обратно к байту []

0 голосов
/ 08 июля 2011

16 байтов на 1 млрд. Записей составляют примерно 15 ГБ.Если у вас есть такая большая часть данных, вам придется решать более серьезные проблемы с масштабируемостью, и эти 15 ГБ при 10 центах / ГБ или меньше не будут иметь большого значения.Отношения ко многим отношениям могут вырасти до такого размера быстрее, но беспокоиться будет не так уж и много.

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

PS Я лично предпочитаю использовать числовые идентификаторы, но это отдельное обсуждение.

...