步驟
1.先在maven配置中引入對應的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
因為spring-boot-starter-data-jpa中已經包含了Hibernate所需要的相關依賴,所以只需要引入Jpa的依賴即可
2.配置application.properties文件
server.port=80
# Hibernate 相關配置
## 方言
#hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
## 顯示Sql
hibernate.show_sql=true
## 自動建表方式
#hibernate.hbm2ddl.auto= update
## 自動掃描的包前綴
entitymanager.packagesToScan= com.zslin
## 數據庫連接
spring.datasource.url=jdbc:mysql://localhost:3306/study05?\
useUnicode=true&characterEncoding=utf-8&useSSL=true&autoReconnect=true
## 用戶名
spring.datasource.username=root
## 密碼
spring.datasource.password=123
## 數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
## 建表方式
spring.jpa.properties.hibernate.hbm2ddl.auto=update
# 方言
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
說明:
spring.jpa.properties.hibernate.hbm2ddl.auto有幾種配置:
- create:每次加載Hibernate時都會刪除上一次生成的表,然后重新生成新表,即使兩次沒有任何修改也會這樣執行,這就導致每次啟動都是一個新的數據庫,也是導致數據丟失的重要原因。
- create-drop:每次加載Hibernate時都會生成表,但當SessionFactory關閉時,所生成的表將自動刪除。
- update:最常用的屬性值,第一次加載Hibernate時創建數據表(前提是需要先有數據庫),以后加載HIbernate時只會根據model更新,即使model已經刪除了某些屬性,數據表也不會隨之刪除字段。
- validate:每次加載Hibernate時都會驗證數據表結構,只會和已經存在的數據表進行比較,根據model修改表結構,但不會創建新表。
聲明實體
@Entity
對實體注釋。任何Hibernate映射對象都要有這個注釋
@Entity定義對象將會成為被JPA管理的實體,將映射到指定的數據庫表
@Table
聲明此對象映射到數據庫的數據表,通過它可以為實體指定表(talbe),目錄(Catalog)和schema的名字。該注釋不是必須的,如果沒有則系統使用默認值(實體的短類名)
@Version
該注釋可用於在實體Bean中添加樂觀鎖支持
聲明主鍵
@Id
聲明此屬性為主鍵。該屬性值可以通過自身創建,但是Hibernate推薦通過Hibernate生成
@Id定義屬性為數據庫的主鍵,一個實體里面必須有一
@IdClass
@IdClass利用外部類的聯合主鍵
public @interface IdClass {
Class value();
}
作為符合主鍵類,要滿足以下幾點要求。
必須實現Serializable接口。
必須有默認的public無參數的構造方法。
必須覆蓋equals和hashCode方法。equals方法用於判斷兩個對 象是否相同,EntityManger通過find方法來查找Entity時是根 據equals的返回值來判斷的。在本例中,只有對象的name和 email值完全相同或同一個對象時才返回true,否則返回 false。hashCode方法返回當前對象的哈希碼,生成的hashCode相同的概率越小越好,算法可以進行優化。
@GeneratedValue
指定主鍵的生成策略。有如下四個值:
- TABLE:使用表保存id值
- IDENTITY:identitycolumn
- SEQUENCR :sequence
- AUTO:根據數據庫的不同使用上面三個
聲明普通屬性
@Column
聲明該屬性與數據庫字段的映射關系。
注意:
- 當POJO有屬性不需要映射的時候一定要用@Transitent修飾,該注釋表示此屬性與表沒有映射關系,只是一個暫時的屬性。
- @Lob注釋表示該屬性持久化為Blob或者Clob類型,具體取決於屬性的類型。
共有10個屬性,這10個屬性均為可選屬性:
name屬性定義了被標注字段在數據庫表中所對應字段的名稱;
unique屬性表示該字段是否為唯一標識,默認為false。如果表中有一個字段需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
nullable屬性表示該字段是否可以為null值,默認為true。如果屬性里使用了驗證類里的@NotNull注釋,這個屬性可以不寫。
insertable屬性表示在使用“INSERT”腳本插入數據時,是否需要插入該字段的值。
updatable屬性表示在使用“UPDATE”腳本插入數據時,是否需要更新該字段的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外鍵等。這些字段的值通常是自動生成的。
columnDefinition屬性表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用。若不指定該屬性,通常使用默認的類型建表,若此時需要自定義建表的類型時,可在該屬性中設置。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
table屬性定義了包含當前字段的表名。
length屬性表示字段的長度,當字段的類型為varchar時,該屬性才有效,默認為255個字符。
precision屬性和scale屬性表示精度,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數。
@Basic : 表示該屬性是表字段的映射。 如果實體的字段上沒有任何注解默認就是@Basic
@Enumerated 直接映射枚舉類型的字段
@UpdateTimestamp - 更新時自動更新時間
@CreationTimestamp - 創建時自動更新時間
聲明關聯關系
一對多關聯關系
@OneToMany(mappedBy=” person”,cascade=CascadeType.ALL,fetch=FetchType.LAZY)
一對多聲明
@ManyToOne(cascade=CascadeType.REFRESH)
@JoinColumn
多對一聲明 ,聲明為雙向關聯
一對一關聯關系
@OneToOne(optional= true,cascade =CascadeType.ALL, mappedBy = “person”)
一對一關聯聲明
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = “Person_ID”, referencedColumnName = “personid”,unique = true)
聲明為雙向關聯
多對多關聯關系
@ManyToMany(mappedBy= “students”)
多對多關聯聲明
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = “Teacher_Student”,
joinColumns = {@JoinColumn(name = “Teacher_ID”, referencedColumnName =“teacherid”)},
inverseJoinColumns = {@JoinColumn(name = “Student_ID”, referencedColumnName =“studentid”)})
#######################################################
SpringDataJPA中有個注解@Audited
只需在Entity中加上注解@Audited,就會自動幫你記錄下Entity對應的表的所有操作記錄insert,update,delete,會在數據庫幫你生成一張表xxx_AUD;
這是在SpringDataJPA框架才能使用的一個注解
