【问题标题】:how to make @Lob annotation compatible for both oracle and postgresql如何使 @Lob 注释同时兼容 oracle 和 postgresql
【发布时间】:2021-08-27 01:25:32
【问题描述】:

我的代码设计为同时支持 oracle 和 postgresql,但是 @Lob 注释的行为从 oracle 到 pg 不同,在带有 Java String Object 类型的 oracle @Lob 中效果很好,但是在 pg 中,我应该添加注释 @Type(type ="org.hibernate.type.TextType") 将String映射成pg文本格式,不兼容oracle。 如何让一个 JPA 实体类支持 oracle 和 pg 成为可能?

这是我的实体类。

package hello.world.demo3;

import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.Type;

import javax.persistence.*;

@Entity
@Table(name = "my_task")
@Getter
@Setter
public class Task {
    
    @Id
    @GeneratedValue
    @Column(name = "i_id", nullable = false)
    private Long id;
    
    @Lob
    @Column(name = "c_lob")
    private String lob;

    @Lob
    @Type(type ="org.hibernate.type.TextType")
    @Column(name = "c_text")
    private String text;

}

【问题讨论】:

    标签: java database postgresql oracle spring-data-jpa


    【解决方案1】:

    我建议在@Column注解中使用columnDefinition来指定该字段在底层SQL表中应该是TEXT类型。

    @Column(name = "c_text", columnDefinition = "TEXT")
    private String text;
    

    请注意,指定 @Lob 可能不会在 Postgres 中为您提供所需的行为。在 Postgres 中,使用@Lob 将指示数据库创建一个辅助表,用于存储大量二进制内容。

    【讨论】:

    • 在oracle中使用columnDefinition = "TEXT"时,文本字段可以映射到clob吗?
    • @justin:您可以删除 columnDefinition = "TEXT" - 只需确保在目标数据库中使用“兼容”数据类型(这意味着您不能使用混淆层来创建表 -但无论如何,架构迁移最好使用 Liquibase)
    • @a_horse_with_no_name 我上面的答案是我可以哄 JPA 在 Postgres 中创建正式的 TEXT 列的唯一方法。您的里程和经验当然可能会有所不同。
    • @TimBiegeleisen:正如我所说:如果您需要一个需要使用不同数据库的解决方案,请不要让混淆层创建表。 Liquibase 在这方面要好得多
    • 谢谢,也就是说我不会使用JPA的anto-generate,只是通过写兼容的ddl来创建表
    【解决方案2】:

    不要将 LOMBOK 用于多用途数据库,它对您没有帮助。

    在方法上添加注释会强制 JPA 通过方法访问属性。当对象的内部状态与数据库模式不同时,这是有意义的:

    private String text;
    
    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(name = "text")
    public String getText(text ) {
        return text;
    }
    public void setText(String text) {
        text = text;
    }
    

    阅读:source

    我将这种方法用于本地 Postgres 开发和 Oracle Server。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 2013-08-24
      • 2014-01-24
      • 1970-01-01
      • 2017-07-23
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多