簡體   English   中英

Spring 引導數據 JDBC 字段為 json 值

[英]Spring Boot Data JDBC field as json value

我有一個 model,我想將其保存到數據庫中。

@Data
public class Model {
    @Id
    private UUID id;
    private String name;
    private ModelSettings settings;

    @Data
    static class ModelSettings {
        boolean fuelEngine;
    }
}

create table model
(
    id       uuid        not null,
    name     varchar(25) not null,
    settings jsonb
)

我嘗試使用簡單的存儲庫方法save()將 modelSettings 保存為 jsonb object ,但出現錯誤

ERROR: relation "settings" does not exist

我寫了自定義轉換器,我看到 modelSettings 何時轉換為 json,但在准備語句 Spring 數據后嘗試將設置字段保存到相關表。 如何判斷Spring數據只保存字段為json,而不是相關表中的行?


抱歉,我忘記了帶有 JdbcValue 的 @WritingConverter。

您好請使用嵌入式注釋:嵌入式實體用於在您的 java 數據 model 中具有值對象,即使您的數據庫中只有一張表。

@Data
public class Model {
    @Id
    private UUID id;
    private String name;
    @Embedded(onEmpty = USE_NULL)
    private ModelSettings settings;

    @Data
    static class ModelSettings {
        boolean fuelEngine;
    }
}

您的實體中不能有 object 並期望JDBC為您將其保存為 json。

您需要定義一個String column並為其編寫一個converter ,用於在數據庫中保存和讀取。

還有一些數據庫,如Oracle支持 json 值,但你沒有提到你正在使用哪個數據庫。

Oracle數據庫中,您可以定義一個包含 json 列的表,如下所示:

CREATE TABLE "USERS"
(
    "ID" NUMBER(16,0) PRIMARY KEY,
    "USER_NAME" VARCHAR2(85) UNIQUE NOT NULL,
    "PASSWORD" VARCHAR2(48) NOT NULL,
    "PROFILE" NCLOB NOT NULL CONSTRAINT profile_json CHECK ("PROFILE" IS JSON),
    "SETTINGS" NCLOB NOT NULL CONSTRAINT settings_json CHECK ("SETTINGS" IS JSON),   
 
);

您需要創建實體 class,如下所示:

@Entity
@Table(name = "Users")
public class User {

@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_GENERATOR")
@SequenceGenerator(name = "USER_GENERATOR", sequenceName = "USERS_SEQ", allocationSize = 1)
private Long id;


@Column(name = "USER_NAME")
private String userName;
    
@Column(name = "PASSWORD")
private String password;

@Lob
@Nationalized
@Column(name = "PROFILE",columnDefinition="NCLOB NOT NULL")
private String profile;

@Lob
@Nationalized
@Column(name = "SETTINGS",columnDefinition="NCLOB NOT NULL")
private String settings;

}

正如您在此處看到的, profilesetting是我的 json 列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM