在開始之前, 先簡單介紹一下 H2 是一個輕量型的資料庫, 預設是採用記憶體的方式做資料儲存, 速度非常快, 整體的 jar 檔大約 2.5MB 左右。支援標準的 SQL 語法規範, 與 JDBC API 接口。在 Spring boot (2.7.4) 的官方文檔 中也有一些簡單的描述與介紹。
整體來說, 輕量快速反應, 滿符合敏捷精神的, 大團隊或小團隊都有適合他使用的情境.
alter column
或是 drop column
, 若公司組織規模稍大, 還需要提交給 DBA 去執行這些指令, 有較多的溝通成本。spring.jpa.hibernate.ddl-auto: update
的特性, 自動更新 schema。spring.h2.console.eanbled: true
就能在瀏覽器做一些 table 的查詢。這邊推薦使用 Spring boot initializr 來初始化專案。
專案的 pom.xml
裡面的套件依賴描述大概會長這樣子。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
專案的 application.properies
我通常習慣改為 application.yml
比較符合我的閱讀習慣, 細部說明就寫在註解裡面了。
spring:
# spring datasource configuration 的配置
datasource:
driver-class-name: org.h2.Driver
username: 'sa'
password:
url: 'jdbc:h2:mem:my_app' # H2 的 JDBC URL, mem 表示使用記憶體, my_app 是資料庫的名稱
h2:
console:
enabled: true # 設定要啟用 H2 的 console 可以在瀏覽器上面查詢 table
path: '/h2' # 瀏覽器 console 的 URL 路徑
jpa:
generate-ddl: false
open-in-view: false
hibernate:
ddl-auto: update # 當 spring boot entity 有修改時, 會自動修改 DB scheam
來建立一個簡單的 JPA Entity 吧
/**
* 這邊的 @Getter 與 @Setter 是 lombok 的功能, 不採用 @Data 在底下說明
*/
@Getter
@Setter
@Entity
public class ProductEntity implements Serializable {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private BigDecimal price;
}
主要是 @Data
包含了 @EqualsAndHashCode
與 @ToString
這個功能, 分別會去實作 Java Class 的 equals
, hashCode
, toString
方法。
@Override
public boolean equals(Object o) {...}
@Override
public int hashCode() {...}
@Override
public String toString() {...}
這會有什麼影響呢? 可以思考一下, JPA 的 Entity 本身就有 @Id
field 可以做 equals 的比較了, 真的還需要去覆寫 equals(Object o)
這個方法嗎?
其二, 當資料庫有關聯時, 比如說 @OneToMany
時, lombok 因為會自動掃描所有 fields 去產生 hashCode()
與 toString()
而破壞了 lazy loadding 機制, 這不就失去 lazy loadding 的用意了嗎?故 非常不建議 在 Entity 使用 lombok 的 @Data
。
最後, 打開瀏覽器, 登入 http://localhost:8080/h2
就能看到以下畫面