在Postgresql中存储任意长度的字符串

时间:2012-02-06 10:22:09

标签: database hibernate postgresql jpa spring-roo

我有一个Spring应用程序,它使用最初使用Spring Roo创建的JPA( Hibernate )。我需要存储任意长度的字符串,因此我使用 @Lob 注释了该字段:

public class MyEntity{

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

    ...
}

该应用程序在localhost中运行正常,但我已将其部署到外部服务器,并且出现了编码问题。出于这个原因,我想检查存储在PostgreSQL数据库中的数据是否正常。应用程序自动创建/更新表。对于该字段(消息),它创建了一个类型为

的列
  

text NOT NULL

问题是,如果我浏览表格后存储数据或只是执行该列的SELECT,我看不到文本而是数字。这些数字似乎是存储该信息的“某处”的标识符。

有人能告诉我这些标识符是什么,以及是否有任何方法可以从pgAdmin或select子句中查看@Lob columm中存储的数据?

有没有更好的方法在JPA中存储任意长度的字符串?

感谢。

3 个答案:

答案 0 :(得分:19)

我建议跳过'@Lob'注释并使用columnDefinition,如下所示:

@Column(columnDefinition="TEXT")

看看这有助于在浏览数据库时查看数据。

答案 1 :(得分:1)

使用@LOB定义,这是正确的。该表正在将OID存储到目录中 - > postegreSQL->表格 - > pg_largeobject表。

二进制数据存储在此处,JPA将正确地获取数据并将其作为实现细节存储。

答案 2 :(得分:0)

旧问题,但这是我遇到此问题时发现的内容: 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通过显式创建一个大对象实例,然后将该对象的UID存储在与属性关联的列中,来存储@Lob String属性值。

很显然,我们的注释文字实际上不在该列中。那在哪呢答案是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