Spring Data 2020.0 - Spring Data R2DBC 1.2 的新增功能

工程 | Mark Paluch | 2020 年 11 月 18 日 | ...

此版本是 Spring R2DBC 支援的一大里程碑。Spring 對 R2DBC 的支援始於兩年前的一個實驗性專案,旨在評估反應式 SQL 整合的外觀。在此版本中,Spring Data R2DBC 進行了一次重大的重構,將幾個元件移至專用的 spring-r2dbc 模組中,並棄用 Spring Framework 提供的元件。除了此變更之外,Spring Data R2DBC 還包含以下最顯著的變更:

  • 透過 EntityCallback API 新增生命週期回呼
  • 反應式稽核
  • 傳遞 enum 值和 Postgres Geo 類型

Spring R2DBC

Spring Data R2DBC 現在基於 spring-r2dbc,這是 Spring Framework 中的一個新模組,它附帶核心 R2DBC 支援,例如 DatabaseClientConnectionFactoryInitializerR2dbcTransactionManager。 這些元件已被棄用,以支持 Spring R2DBC 元件,並標記為在下一個主要的 Spring Data R2DBC 版本中移除。請參閱遷移指南,以了解有關棄用以及要使用的替代 API。

生命週期 EntityCallback 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));

取得 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

檢視全部