我们正在使用一个看起来像这样的 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 提供程序(在我的例子中是休眠)可以为我正确生成 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
键入?提前致谢。