Blob в Java / Hibernate / sql-server 2005 - PullRequest
       22

Blob в Java / Hibernate / sql-server 2005

0 голосов
/ 07 декабря 2009

Я пытаюсь вставить HTML-блоб в нашу базу данных sql-server2005. Я использовал тип данных [текст] для поля, в котором в конечном итоге будет жить BLOB-объект. Я также поместил аннотацию «@Lob» на поле в модели предметной области. Проблема возникает в том случае, если размер блоба HTML, который я пытаюсь сохранить, превышает 65536 символов.

Кажется, что это символьный лимит для текстового типа данных при использовании аннотации @Lob. В идеале я хотел бы сохранить весь блоб в целости, а не разбивать его на несколько строк в базе данных.

Разрешите уточнить аннотация:

 @Lob   
 @Column(length = Integer. MAX_VALUE) //per an answer on stackoverflow  
 private String htmlBlob;  

сторона базы данных (sql-server-2005):

CREATE TABLE dbo.IndustrySectorTearSheetBlob(  
   ...  
      htmlBlob text NULL    
...
)

Все еще вижу усечение после 65536 символов ...

РЕДАКТИРОВАТЬ: Я распечатал содержимое всех возможных строк (только 10 прямо сейчас), которые будут вставлены в базу данных. Кажется, что каждая строка содержит все символы, судя по тому, что html-тег close присутствует в конце строки ....

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

Вы можете посмотреть на аннотирование также

@Column(length = Integer.MAX_VALUE)

Не знаю, зачем нужен большой двоичный объект, хотя NVARCHAR (MAX) будет хранить все нужные вам html.

1 голос
/ 07 декабря 2009

На самом деле, я думаю, что вы ищете, это поле CLOB. Цитирование Использование расширенных типов данных :

Типы данных BLOB и CLOB и NCLOB

Драйвер JDBC реализует все методы java.sql.Blob, java.sql.Clob и java.sql.NClob интерфейсы.

Примечание. Значения CLOB можно использовать с SQL Server 2005 большие типы данных. В частности, могут быть использованы типы CLOB с varchar (max) и nvarchar (max) типы данных, типы BLOB могут использоваться с Можно использовать varbinary (max) и image типы данных и типы NCLOB с ntext и nvarchar (max) .

Другими словами, используйте VARCHAR (MAX) или NVARCHAR (MAX), если вам нужна поддержка юникода. Об их максимальной длине:

Максимальный размер хранилища для VARCHAR (MAX) составляет 2 ^ 31-1 байт (2 147 483 647 байт или 2 ГБ - 1 байт). Размер хранилища - это фактическая длина введенных данных + 2 байта. Введенные данные могут быть длиной 0 символов. Поскольку каждый символ в типе данных VARCHAR использует один байт, максимальная длина для типа данных VARCHAR (MAX) составляет 2 147 483 645.

Максимальный размер хранилища для NVARCHAR (MAX) также составляет 2 ^ 31-1 байт (2 147 483 647 байт или 2 ГБ - 1 байт). Размер хранилища в байтах в два раза превышает количество введенных символов + 2 байта. Введенные данные могут быть длиной 0 символов. Поскольку каждый символ Unicode в типе данных NVARCHAR использует два байта, максимальная длина для типа данных NVARCHAR (MAX) составляет 1 073 741 822.

Этого должно быть достаточно для вашего HTML.

РЕДАКТИРОВАТЬ: На стороне Hibernate ваша аннотированная сущность выглядит хорошо. На стороне базы данных, это должно быть в порядке. Однако не могли бы вы попытаться использовать VARCHAR (MAX) вместо TEXT (и устранить это сомнение относительно TEXT).

CREATE TABLE dbo.IndustrySectorTearSheetBlob (
...
htmlBlob varchar(max) NULL
... 
)

Кстати, какой диалект Hibernate вы используете? А какой драйвер JDBC вы используете?

0 голосов
/ 07 декабря 2009

Хм, я не использовал Hibernate с Sql-Server 2005, но я использовал Oracle TopLink с MySQL. Я использовал в своем объекте прямую byte[] без каких-либо аннотаций, и она работала нормально.

Итак, на вашем месте я бы попытался сохранить ваш HTML в закодированном байте [] (используйте UTF-8 или любой другой). Всякий раз, когда вам нужен доступ к тексту HTML в виде строки, вы можете просто декодировать его.

Теоретически, ваш текст не должен быть обрезан, но иногда эти вещи терпят неудачу.

...