хранить строки произвольной длины в Postgresql - PullRequest
11 голосов
/ 06 февраля 2012

У меня есть приложение Spring, которое использует JPA ( Hibernate ), изначально созданное с помощью Spring Roo. Мне нужно хранить строки произвольной длины, поэтому я пометил поле с помощью @ Lob :

public class MyEntity{

    @NotNull
    @Size(min = 2)
    @Lob
    private String message;

    ...
}

Приложение работает нормально в localhost, но я развернул его на внешнем сервере, и появилась проблема с кодировкой. По этой причине я хотел бы проверить, в порядке ли данные, хранящиеся в базе данных PostgreSQL, или нет. Приложение создает / обновляет таблицы автоматически. И для этого поля (сообщения) он создал столбец типа:

текст НЕ НУЛЬ

Проблема в том, что после сохранения данных, если я просматриваю таблицу или просто делаю ВЫБОР этого столбца, я не вижу текст, но цифры. Эти числа кажутся идентификаторами «где-то», где хранится эта информация.

Может кто-нибудь сказать мне точно, что это за идентификаторы и есть ли возможность увидеть сохраненные данные в столбце @Lob из pgAdmin или из предложения select?

Есть ли лучший способ хранить строки произвольной длины в JPA?

Спасибо.

Ответы [ 3 ]

19 голосов
/ 06 февраля 2012

Я бы рекомендовал пропустить аннотацию '@Lob' и использовать columnDefinition следующим образом:

@Column(columnDefinition="TEXT")

посмотрите, помогает ли это просматривать данные при просмотре самой базы данных.

1 голос
/ 29 сентября 2015

Используйте определение @LOB, оно правильное.В таблице хранится OID для каталогов -> postegreSQL-> tables -> pg_largeobject table.

Двоичные данные хранятся здесь эффективно, и JPA корректно выведет данные и сохранит их для вас с подробностями реализации.

0 голосов
/ 10 января 2019

Старый вопрос, но вот что я нашел, когда столкнулся с этим: http://www.solewing.org/blog/2015/08/hibernate-postgresql-and-lob-string/

Соответствующие детали ниже.

    @Entity
    @Table(name = "note")
    @Access(AccessType.FIELD)
    class NoteEntity {

      @Id
      private Long id;

      @Lob
      @Column(name = "note_text")
      private String noteText;

      public NoteEntity() { }

      public NoteEntity(String noteText) { this.noteText = noteText }
    }

Hibernate PostgreSQL9Dialect хранит атрибут @Lob Stringзначения путем явного создания экземпляра большого объекта, а затем сохранения UID объекта в столбце, связанном с атрибутом.

Очевидно, что текст наших заметок на самом деле не находится в столбце,Так где это?Ответ в том, что Hibernate явно создал большой объект для каждой заметки и сохранил UID объекта в столбце.Если мы используем некоторые функции больших объектов PostgreSQL, мы можем получить сам текст.

Используйте это для запроса:

SELECT id, 
  convert_from(loread(
      lo_open(note_text::int, x'40000'::int), x'40000'::int), 'UTF-8') 
  AS note_text
FROM note
...