1. 程式人生 > >二十、Spring boot整合Jpa API

二十、Spring boot整合Jpa API

(一)新增依賴

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

(二)配置資料來源和JPA

spring:
    datasource:
        #JDBC配置檔案
        name: test
        url: jdbc:mysql://127.0.0.1:3306/tomcat
        username: root
        password: root
        driver-class-name: com.mysql.jdbc.Driver
    jpa:
      database: mysql
      #是否在啟動時的時候初始化schema(建立表)---ddl資料庫定義語言
      generate-ddl: true
      #顯示sql語句
      show-sql: true
      hibernate:
              #      create 每次都先刪除表,再建立表
              #      create-drop 每次應用停止,刪除表
              #      update 不建立表,保留原有資料
              #      none 不做任何動作
              #      valiad 驗證類中的屬性與表中的欄位是否一致,不一致會報錯
              ddl-auto: create-drop

(三)實體雙向關係   在JPA中,實體雙向關係主要有

  • @OneToOne 一對一
  • @OneToMany 一對多
  • @ManyToOne 多對一
  • @ManyToMany 多對多   需要注意的是,不管哪種關係,一定要使用mappedBy屬性,在受控方設定該物件在主控方的屬性,設定主從關係(PS:mappedBy屬性設在哪個物件,那麼對方就會把這個物件的主鍵id作為外來鍵)。 1、@OneToOne (一對一) 裡面涉及到的一些註解如下: @Entity:實體名,有這個註解才能保證被對映成表 @Table(name = “customers”):設定對映表的表名 @Id:主鍵 @GeneratedValue:主鍵自增 @Column(length = 200):設定列值長度為200 @OneToOne(cascade = CascadeType.REMOVE):設定級聯刪除,在主控方設定 @OneToOne(mappedBy = “creditCard”):在受控方加該主鍵,mappedBy:反轉控制,即控制權在“creditCard”屬性所在的類Customer

以客戶(Customer)和信用卡(CreditCard)為例講解一對一關係: 客戶:

/**
 * @Access(value = AccessType.FIELD):注入的時候只通過欄位的方式,不通過get()和set()方式
 * @Table(name = "customers"):建立的表名
 */
@Entity
@Access(value = AccessType.FIELD)
@Table(name = "customers")
public class Customer {
    /**
     * @Id:主鍵
     * @GeneratedValue:主鍵自增
     */
    @Id
    @GeneratedValue
    private Long id;
    /**
     * @Column(length = 200):設定列值長度為200
     */
    @Column(length = 200)
    private String name;
    /**
     * 設定級聯刪除,在主控方設定
     */
    @OneToOne(cascade = CascadeType.REMOVE)
    private CreditCard creditCard;
}

信用卡:

/**
 * @author 鹹魚
 * @date 2018/9/29 19:12
 */
@Entity
@Table(name = "credit_cards")
public class CreditCard {
    @Id
    @GeneratedValue
    private Long id;
    @Column(length = 128)
    private String number;
    @Column(name = "reg_date")
    private Date registerDate;
    /**
     * mappedBy:反轉控制,即控制權在“creditCard”屬性所在的類Customer
     */
    @OneToOne(mappedBy = "creditCard")
    private Customer customer;
}

2、@OneToMany (一對多)和@ManyToOne (多對一)   這兩個註解一般成隊出現,一對多或者多對一關係中,一般多方為控制方,一方為受控方。   這裡用到的兩個註解:

  • @ManyToOne 多方 主控方
  • @OneToMany(mappedBy = “store”) 一方 受控方

  這裡以商店(Store)和客戶(Customer)為例進行講解:   在客戶(Customer)實體中新增商店(Store)物件。

/**
     * 多方
     */
    @ManyToOne
    private Store store;

商店(Store)

@Entity
@Table(name = "stores")
public class Store {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    /**
     * 一方
     */
    @OneToMany(mappedBy = "store")
    private List<Customer> customers;
}

3、@ManyToMany (多對多)