Book.java
Springboot/bookstore-api/src/main/java/com/example/bookstore/entity/Book.java
package com.example.bookstore.entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;
import jakarta.persistence.UniqueConstraint;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 書籍 Entity——對應資料庫中的 books 資料表。
* 這是本教材 CRUD(Create / Read / Update / Delete)操作的主角。
*
* 對應關係示意:
* Java 類別 Book <--> 資料表 books
* Java 欄位 title <--> 資料表欄位 title (VARCHAR(200))
* 一個 Book 物件 <--> books 資料表的一列資料
*/
@Entity
@Table(name = "books", uniqueConstraints = {
// ISBN 是書籍的國際標準編號,同一本書不可重複建檔
@UniqueConstraint(name = "uk_books_isbn", columnNames = "isbn")
})
public class Book {
/** 主鍵:由 MySQL AUTO_INCREMENT 自動產生 */
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/** 書名:NOT NULL、最長 200 字元(對應 VARCHAR(200) NOT NULL) */
@Column(nullable = false, length = 200)
private String title;
/** 作者 */
@Column(nullable = false, length = 100)
private String author;
/** ISBN 國際標準書號(例如 9786263336070) */
@Column(nullable = false, length = 20)
private String isbn;
/**
* 價格:金額請務必使用 BigDecimal!
* float / double 有二進位浮點數誤差(0.1 + 0.2 != 0.3),不適合金錢計算。
* precision = 10, scale = 2 → 對應 MySQL 的 DECIMAL(10,2),
* 表示總共 10 位數,其中小數佔 2 位。
*/
@Column(nullable = false, precision = 10, scale = 2)
private BigDecimal price;
/** 庫存數量 */
@Column(nullable = false)
private Integer stock;
/**
* 書籍簡介:允許 NULL。
* columnDefinition = "TEXT" → 直接指定 MySQL 欄位型別為 TEXT,
* 可儲存比 VARCHAR 更長的文字內容。
*/
@Column(columnDefinition = "TEXT")
private String description;
/** 建立時間:INSERT 前由 @PrePersist 自動填入,之後不再變動 */
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
/** 最後更新時間:每次 UPDATE 前由 @PreUpdate 自動更新 */
@Column(name = "updated_at")
private LocalDateTime updatedAt;
/** JPA 規定的無參數建構子(Hibernate 建立物件時使用) */
public Book() {
}
/** 方便在程式中建立新書籍的建構子 */
public Book(String title, String author, String isbn,
BigDecimal price, Integer stock, String description) {
this.title = title;
this.author = author;
this.isbn = isbn;
this.price = price;
this.stock = stock;
this.description = description;
}
/** INSERT 之前自動執行:填入建立時間與初始更新時間 */
@PrePersist
protected void onCreate() {
this.createdAt = LocalDateTime.now();
this.updatedAt = this.createdAt;
}
/** UPDATE 之前自動執行:刷新最後更新時間 */
@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
// ========================= Getter / Setter =========================
public Long getId() {
return id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Integer getStock() {
return stock;
}
public void setStock(Integer stock) {
this.stock = stock;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public LocalDateTime getCreatedAt() {
return createdAt;
}
public LocalDateTime getUpdatedAt() {
return updatedAt;
}
}
相關文章
BookstoreApiApplication.java
BookstoreApiApplication.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/BookstoreApiApplication.java).
閱讀文章 →DataInitializer.java
DataInitializer.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/DataInitializer.java).
閱讀文章 →SecurityConfig.java
SecurityConfig.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/SecurityConfig.java).
閱讀文章 →AuthController.java
AuthController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/AuthController.java).
閱讀文章 →BookController.java
BookController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/BookController.java).
閱讀文章 →ApiErrorResponse.java
ApiErrorResponse.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/dto/ApiErrorResponse.java).
閱讀文章 →