簡體   English   中英

在休眠初始化之前加載彈簧屬性

[英]Loading spring property before hibernate initialization

在我的 JPA-Springboot-app 中,我必須支持不同的數據庫,即 postgres 和 oracle。 我有一個 lob 類型的實體,我想將數據存儲為字符串。 由於 postgres 存儲 lob 的方式與其他數據庫不同,因此我嘗試根據以下說明選擇依賴於數據庫方言的 sql 類型: https ://geeknet.me/hibernate-postgresql-the-lob-annotation/

所以這就是我所擁有的:

@Entity
public class MyEntity {

    @EmbeddedId
    private MyPk myPk;

    @Lob
    @Column(name = "value", nullable = false)
    @Type(type = "org.example.DatabaseAwareLobType")
    private String value;
}

DatabaseAwareLobType 看起來像:

import org.hibernate.type.descriptor.java.StringTypeDescriptor;
import org.hibernate.type.descriptor.sql.ClobTypeDescriptor;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
...

@Component
public class DatabaseAwareLobType extends AbstractSingleColumnStandardBasicType<String> {

    @Value("${spring.jpa.properties.hibernate.dialect}")
    private String dbDialect;

    private static String DBDIALECT_STATIC;

    public static final DatabaseAwareLobType INSTANCE = new DatabaseAwareLobType();

    public DatabaseAwareLobType() {
        super(getDbDescriptor(), StringTypeDescriptor.INSTANCE );
    }
    public static SqlTypeDescriptor getDbDescriptor() {
        if( isPostgres() ) {
            return VarcharTypeDescriptor.INSTANCE;
        }
        else {
            return ClobTypeDescriptor.DEFAULT;
        }
    }

    private static boolean isPostgres() {
        if(Objects.isNull(DBDIALECT_STATIC) ) {
            return false;
        }

        return DBDIALECT_STATIC.contains( "postgres" );
    }

    @Value("${spring.jpa.properties.hibernate.dialect}")
    public void setDbDialectStatic(String dbDialect) {
        DatabaseAwareLobType.DBDIALECT_STATIC = dbDialect;
    }

}

我的問題是dbDialect DBDIALECT_STATIC 屬性。 它們沒有任何價值,因為休眠初始化是在加載應用程序屬性之前完成的。

在鏈接的指令中,屬性是手動讀取的。 我不能這樣做,因為我不知道使用哪個屬性文件(不同的彈簧配置文件,通過 docker 環境自定義)。

我正在搜索在應用程序啟動之前加載屬性,可能是為了初始化數據庫類型的 bean。 但我沒有找到適合我的問題的解決方案。 也許我正在嘗試錯誤的方式。

有誰知道我該如何解決這個問題? 我很感謝任何建議。

所以我沒有找到解決辦法。 我有一個替代實現。

首先,我將屬性類型從 String 更改為 byte[] 並使用 Hibernates BinaryType 進行映射

@Entity
public class MyEntity {

    @EmbeddedId
    private MyPk myPk;

    @Lob
    @Column(name = "data", nullable = false)
    @Type(type="org.hibernate.type.BinaryType")
    private byte[] data;
}

我用 liquibase 建立了數據庫。 LOB 列不再來自 clob 類型,而是來自 blob。 所以我的 liquibase-changelog 看起來像:

<createTable tableName="my_entity" schemaName="importservice">
...
    <column name="data" type="${blob_type}">
        <constraints nullable="false" />
    </column>
</createTable>

並且目標數據庫被 lob 類型的關聯屬性考慮在內:

<property name="blob_type" value="bytea" dbms="postgresql"/>
<property name="blob_type" value="blob"/>

所以現在有一個額外的步驟來將字節數組轉換為字符串,反之亦然。 但這對我來說沒問題。

暫無
暫無

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

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