springboot中hibernate之自動創建表


步驟

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框架才能使用的一個注解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM