我有一个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中存储任意长度的字符串?
感谢。
答案 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