JPA нельзя привести к java.sql.Blob

Я использую JPA2 с спящим режимом 3.6.1. и базу данных Derby, и я использовал следующую аннотацию для большого двоичного объекта:

@Column(length = Integer.MAX_VALUE)
@Lob
long[] bucket;

Hibernate создает правильный столбец больших двоичных объектов, но если я пытаюсь сохранить объект, я получаю следующее исключение:

java.lang.ClassCastException: [J нельзя преобразовать в java.sql.Blob

почему и как я могу заставить это работать?

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


person suicide    schedule 07.03.2011    source источник


Ответы (1)


Вам нужно отобразить свойство как byte[], а не как long[].

В документации говорится

@Lob указывает, что свойство должно сохраняться в Blob или Clob в зависимости от типа свойства: java.sql.Clob, Character[], char[] и java.lang.String будут сохраняться в Clob. java.sql.Blob, Byte[], byte[] и сериализуемый тип будут сохраняться в большом двоичном объекте.

Если тип свойства реализует java.io.Serializable и не является базовым типом, и если свойство не аннотировано с помощью @Lob, то используется сериализуемый тип Hibernate.

Если вы хотите сохранить массив, вам потребуется создать собственный тип пользователя для преобразования типа данных. Пример можно найти здесь http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e2794

person Augusto    schedule 07.03.2011
comment
хорошо спасибо. Есть ли другой способ сохранить long[] без необходимости преобразовывать его в byte[] или что-то в этом роде вручную? - person suicide; 07.03.2011
comment
Пожалуйста, проверьте ответ, я добавил ссылку с одним примером из документации. - person Augusto; 07.03.2011