[英]Reading a property before initialization of Spring Boot Application
[英]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.