我们正在使用看起来像这样的JPA注释类型(groovy代码):
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
String text
}
Run Code Online (Sandbox Code Playgroud)
在第一次编写时,我是JPA的新手并首先编写SQL,然后使注释的类与SQL匹配.阅读PostgreSQL似乎以下是我想要的表:
CREATE TABLE textnote (
id bigint NOT NULL,
text text
);
Run Code Online (Sandbox Code Playgroud)
这很有效,我们的表格看起来像这样:
id | text
-----+------------------------
837 | really long text here
Run Code Online (Sandbox Code Playgroud)
我现在要做的是纠正JPA实体看起来像这样:
@Entity
@EqualsAndHashCode
class TextNote extends Serializable {
@Id Long id
@Lob String text
}
Run Code Online (Sandbox Code Playgroud)
通过添加@Lob注释,JPA提供程序(在我的情况下,hibernate)可以为我正确生成DDL,以防我们想要交换数据库.它还准确记录了我想要的文本字段.现在,当一个笔记被创建时,我看到这样的东西:
id | text
-----+------------------------
837 | 33427
Run Code Online (Sandbox Code Playgroud)
这对于新笔记来说很好,因为当我使用String getText()在代码中读取它时,它会返回非常长的文本.老实说我不知道PostgreSQL如何实现这种text类型,理论上我也不需要.但是,我们的生产数据库已经使用没有@Lob注释的旧代码存储了许多注释.在现有数据库上运行新代码会产生如下问题:
org.springframework.dao.DataIntegrityViolationException: Bad value for type long : not a number this time; …Run Code Online (Sandbox Code Playgroud)