我们正在使用一个JPA注解类型,它看起来像这样(groovy代码):
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
第一次写这个时,我对JPA非常陌生,先写了SQL,然后使注释的类与SQL匹配。通过阅读PostgreSQL,似乎以下是我想要的表格:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
这样做成功了,我们得到了像这样的表格:
id | text
-----+------------------------
837 | really long text here
我现在想要做的是将JPA实体纠正为以下内容:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
通过添加
@Lob
注释,JPA提供者(在我的情况下,是Hibernate)可以为我生成DDL,以防我们想要更换数据库。它还可以准确记录我希望文本字段的格式。现在当笔记被创建时,我会看到类似下面的内容: id | text
-----+------------------------
837 | 33427
对于新的笔记来说很好,因为当我使用String getText()在代码中读取时,它会返回真正的长文本。老实说,我不知道PostgreSQL是如何实现text
类型的,理论上也不需要知道。然而,我们的生产数据库已经存储了许多使用旧代码而没有@Lob
注释的笔记。在现有数据库上运行新代码会生成类似这样的问题:
org.springframework.dao.DataIntegrityViolationException: Bad value for type long : not a number this time; SQL [n/a]; nested exception is org.hibernate.exception.DataException: Bad value for type long : not a number this time
对于现有的笔记,是否有一种在 SQL 中迁移旧笔记以正确使用 @Lob
和 text
类型的方法?提前感谢您的帮助。
@Lob
生成PostgreSQLtext
类型,这正是我想要的。如果我想切换数据库,则希望使用JPA提供程序为我生成DDL。为了做到这一点,必须使用@Lob
。明白了吗? - Joe@Lob
生成的是text
吗?无论是文档还是您发布的输出结果都让我觉得它会生成oid
——这也是Postgres存储大对象的方式。如果它真的是text
,那么你应该只能看到_text_,而不是一个神秘的数字。 - Eevee@Lob
注释输出的表格:gist - Joe@Type(type="org.hibernate.type.StringClobType")
,文本再次以人类可读的方式存储。我想原始问题基于对PostgreSQL的错误假设,所以感谢您的纠正! :-) - Joe