JAVA继承+json类型的Postgresql

标签 java spring postgresql hibernate

我在 JAVA 中有继承权,我们的 DBA 建议我为所有子项创建一个表(就像一个单表策略),但创建一个包含所有特定信息的 json 数据类型。 这是一个好的做法吗?

我举一个例子,有这三个表:

图片:thumbnailId 长,
视频:持续时间整数,
媒体:ID、名称、描述、类型

仅移动到一张表:
媒体:id、名称、描述、类型、extra_fields

在图像的情况下,额外的字段应该存储缩略图,在视频的情况下,它应该将持续时间存储为 json。

所以:

1- 这是个好主意吗?

2- 这个用JAVA+Spring容易实现吗?

谢谢

最佳答案

这很容易实现。这是一个示例:

@Entity(name = "Step")
@Table(name = "step")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StepEntity {

    @Column(name = "STEP_data")
    @Convert(converter = StepDataAttributeConverter.class)
    private StepData data;

    public StepEntity() {
        super();
    }

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class StepData {

        /* some fields */

        @JsonCreator
        public StepData() {
            super();
        }
    }
}

public class StepDataAttributeConverter implements AttributeConverter<StepEntity.StepData, String> {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(StepEntity.StepData attribute) {

        if (attribute == null) {
            return null;
        } else {
            try {
                return MAPPER.writeValueAsString(attribute);
            } catch (JsonProcessingException e) {
                return null;
            }
        }
    }

    @Override
    public StepEntity.StepData convertToEntityAttribute(String dbData) {
        if (dbData == null) {
            return null;
        } else {
            try {
                return MAPPER.readValue(dbData, StepEntity.StepData.class);
            } catch (IOException e) {
                return null;
            }
        }
    }
}

我不太确定这是一个好的做法。对该字段进行搜索查询将非常困难。就我而言,我有一个 Elasticsearch 来完成所有搜索。但如果您没有类似的东西,我建议您在执行此操作之前三思而后行,并真正确保您不需要在此字段上进行搜索。

关于JAVA继承+json类型的Postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50373241/

相关文章:

python - 如何以安全的方式从外部访问 PostgreSQL 数据库

java - 使用自定义类加载器时覆盖 IntelliJ 中的调试类路径

java - 使用 Spring AOP 拦截特定注解

spring - Spring中的构造函数注入(inject)

spring - 如何从现有的 Spring REST API 生成 OpenAPI 3.0 YAML 文件?

PostgreSQL 表 : How can I find a list of values that were inserted during a given time period?

postgresql - Postgres BDR 复制停止 - 复制槽不活动

java - 我可以使用 ForkJoinPool 的工作窃取行为来避免线程饥饿死锁吗?

java - tomcat应用程序未启动时如何创建错误事件

java - 如何在 Databricks Spark Scala 中使用当月的第一天创建变量?