加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何将PostgreSQL字符串迁移到文本类型?

发布时间:2020-12-13 16:33:38 所属栏目:百科 来源:网络整理
导读:我们使用的JPA注释类型如下(groovy代码): @Entity@EqualsAndHashCodeclass TextNote extends Serializable { @Id Long id String text} 当我第一次写的时候,我非常新的JPA,并先写了SQL,然后使注释类与SQL匹配.在PostgreSQL上阅读,好像以下是我想要的表: CR
我们使用的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如何实现文本类型,也不需要理论上的理解.然而,我们的生产数据库已经有许多使用旧代码存储的笔记,而没有@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和文本类型?提前致谢.

基于 Postgres large object docs,您需要将每个文本块写入文件并单独导入.这不是你应该在SQL中做的事情.

我不了解JPA的任何内容,但是@Lob与DDL或数据库切换有什么关系?您已经完全改变了列的类型; Postgres的文字类型有什么问题?

在这里关闭循环,这样在注释中不会丢失:

真正的问题是@Lob创建一个Postgres文本列,但是Hibernate treats it是一个本地的Postgres“大对象”,它将数据存储在其他位置,并在表中留下一个oid(根据列类型将其保存为文本) .这通常不是你想要的文字.

OP的解决方案是拍摄@Type(type =“org.hibernate.type.StringClobType”),以强制Hibernate存储常规文本.

Postgres通常不会将文本存储为五位数的整数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读