領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多此版本是 Spring R2DBC 支援的一大里程碑。Spring 對 R2DBC 的支援始於兩年前的一個實驗性專案,旨在評估反應式 SQL 整合的外觀。在此版本中,Spring Data R2DBC 進行了一次重大的重構,將幾個元件移至專用的 spring-r2dbc
模組中,並棄用 Spring Framework 提供的元件。除了此變更之外,Spring Data R2DBC 還包含以下最顯著的變更:
EntityCallback
API 新增生命週期回呼enum
值和 Postgres Geo 類型Spring Data R2DBC 現在基於 spring-r2dbc
,這是 Spring Framework 中的一個新模組,它附帶核心 R2DBC 支援,例如 DatabaseClient
、ConnectionFactoryInitializer
和 R2dbcTransactionManager
。 這些元件已被棄用,以支持 Spring R2DBC 元件,並標記為在下一個主要的 Spring Data R2DBC 版本中移除。請參閱遷移指南,以了解有關棄用以及要使用的替代 API。
Spring Data Moore 引入了EntityCallback
API,用於在載入、儲存和刪除操作時預先處理和後處理實體。 實體回呼在持久性操作期間調用,並允許對實體進行就地修改,如果實體類別是不可變的,則傳回新的物件實例。
EntityCallback
介面透過傳回 Publisher<T>
(其中 T
代表實體類型) 來啟用反應式功能。 傳回發布者允許使用訂閱者上下文(如反應式稽核中所做的那樣),或與其他反應式元件整合,這些元件在儲存實體之前或載入實體之後執行 I/O。
您可以將 EntityCallback
用於各種回呼掛鉤。 以下範例定義了一個 BeforeConvertCallback
,用於從 H2 序列為 Customer
類型產生主索引鍵值(如果其識別碼為 null
)
@Bean
BeforeConvertCallback<Customer> idGeneratingCallback(DatabaseClient databaseClient) {
return (customer, sqlIdentifier) -> {
if (customer.getId() == null) {
return databaseClient.sql("SELECT primary_key.nextval") //
.map(row -> row.get(0, Long.class)) //
.first() //
.map(customer::withId);
}
return Mono.just(customer);
};
}
您可以閱讀有關R2DBC EntityCallbacks 的更多資訊,請參閱 R2DBC 參考文檔。
enum
值和 Postgres Geo 類型Postgres 支援各種資料類型,其中的枚舉和幾何類型可以直接從 Spring Data R2DBC 中使用。 預設情況下,Spring Data 會使用 enum 的 name()
方法將 enum
值轉換為 String
以表示枚舉值。 R2DBC Postgres 支援(自 0.8.4 版起)一個特定的編碼解碼器,它接受 Java enum
類型並將它們映射到對應的 Postgres 枚舉類型。
考慮以下 Java enum
enum Color {
Blue, Green, White
}
在使用枚舉類型之前,需要在 Postgres 中建立枚舉類型
CREATE TYPE color_enum as enum ('Blue', 'Green', `White`);
CREATE TABLE product (id SERIAL PRIMARY KEY, color color_enum);
建立枚舉類型後,您需要配置驅動程式以將 Java 枚舉與對應的 Postgres 枚舉類型相關聯。 這是透過使用 R2DBC Postgres EnumCodec
builder 完成的。 產生的 CodecRegistrar
必須在建立 ConnectionFactory
之前向連線設定註冊
CodecRegistrar codecRegistrar = EnumCodec.builder().withEnum("color_enum", Color.class).build();
PostgresqlConnectionConfiguration configuration = PostgresqlConnectionConfiguration.builder()
.codecRegistrar(codecRegistrar)
// additional configuration
.build();
另請參閱有關 Postgres 枚舉類型的驅動程式文檔,以供進一步參考。
配置 ConnectionFactory
後,您可以配置 Spring Data 中的特定 enum
類型,以便將其真實值傳遞給驅動程式,而不是將枚舉值轉換為 String
。 在配置簡單類型及其轉換器時,R2dbcCustomConversions
是要使用的進入點
R2dbcCustomConversions conversions = R2dbcCustomConversions.of(PostgresDialect.INSTANCE, new ColorConverter());
現在您可以在您的網域類別中使用枚舉類型
class Product {
@Id Integer id;
Color color;
// getter, setter, constructors omitted for brevity
}
請參閱有關使用明確轉換器覆寫 Enum 映射的參考文檔。
與枚舉相反,使用 Postgres 幾何類型不需要特殊設置,因為 Geo 類型具有固定的類型識別碼並映射到個別 Geo 類型。 Spring Data R2DBC 支援在您的實體中使用以下驅動程式特定類型
io.r2dbc.postgresql.codec.Box
io.r2dbc.postgresql.codec.Circle
io.r2dbc.postgresql.codec.Line
io.r2dbc.postgresql.codec.Lseg
io.r2dbc.postgresql.codec.Point
io.r2dbc.postgresql.codec.Path
io.r2dbc.postgresql.codec.Polygon
或者,您可以在您的網域模型中使用 Spring Data 的 Geo 類型
org.springframework.data.geo.Box
org.springframework.data.geo.Circle
org.springframework.data.geo.Point
org.springframework.data.geo.Polygon
要使用幾何類型,請建立一個表和對應的實體類型
CREATE TABLE venue (id SERIAL PRIMARY KEY, name VARCHAR(255), location POINT);
class Venue {
@Id Long id;
String name;
Point location;
// getter, setter, constructors omitted for brevity
}
最後,您可以在您的應用程式中使用該實體
R2dbcEntityTemplate template = …;
template.insert(new Venue(null, "Seattle Space Needle", Point.of(47.6204,-122.3491));