Как создать Id на спящем объекте, который является байтом [], который отображается на значение varbinary в mysql - PullRequest
1 голос
/ 10 сентября 2010

Я пытаюсь создать сущность с идентификатором байта [12] в спящем режиме. Кажется, что ему не нравится иметь byte [] в качестве первичного ключа и в качестве другого столбца он устанавливает его как tinyblob в резервной базе данных mysql. Я пытался создать строку, но проблема в том, что строка в Java составляет 2 байта на символ, в то время как в mysql это один байт на символ. Я ищу что-то вроде этого

@Entity
public class TestClass {
    @Id
    @Column(length=12)
    private byte[] id;
...

для сопоставления с таблицей mysql, подобной этой

Table 'testclass'
   Column id - varbinary     length 12     primary key
    ...

Я пытался сделать это разными способами (в первую очередь пытаясь поиграться со строками), но, похоже, он не работает правильно. Кто-нибудь уже смог сделать это? Спасибо.

Ответы [ 2 ]

1 голос
/ 11 сентября 2010

byte[] не поддерживается как первичный ключ по причине - использование поля BLOB для первичного ключа не является хорошей идеей (mysql должен будет индексировать большие двоичные объекты, я не уверен, что это будет иметь хорошую производительность).Я даже не уверен, что MySQL разрешает использование BLOB-ключей.Есть ошибка, которая говорит о том, что BLOB / TEXT нельзя использовать в ключевых спецификациях.

Можно использовать:

  • UUID - это 128-битный уникальный идентификатор
  • Base64 - (используя commons-codec ) кодировать ваш байтовый массив в base64 и использовать строковый первичный ключ.
1 голос
/ 10 сентября 2010

Как вы поняли, это не поддерживается стандартным JPA. Из спецификации:

2.1.4 Первичные ключи и идентификационные данные сущности

...

Первичный ключ (или поле или свойство составного первичного ключа) должен быть один из следующих типов: любой Java примитивный тип; любая примитивная обертка тип; java.lang.String; java.util.Date; java.sql.Date. В в общем, однако, приблизительный числовой типы (например, типы с плавающей точкой) никогда не должен использоваться в первичных ключах. Объекты, чьи первичные ключи используют типы кроме них не будет портативным. Если сгенерированные первичные ключи используется только целые типы портативный. Если java.util.Date используется как поле первичного ключа или свойство, временный тип должен быть указан как DATE.

При этом, похоже, вы могли бы использовать тип оболочки вокруг byte[] и реализовать пользовательский тип пользователя. UserType для свойства идентификатора byte [] вики-страница предоставляет реализацию.

См. Раздел 2.4.3.2. Введите документации Hibernate Annotations для объявления и использования этого пользовательского типа с аннотациями.

Ссылки

  • JPA 1.0 Технические характеристики
    • Раздел 2.1.4 «Первичные ключи и идентификационные данные сущности»
  • Справочное руководство по Hibernate

Ресурс

...