S SmartDocs
Chuỗi bài: Springboot java 167 dòng · Cập nhật 2026-08-14

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;
    }
}

Bài viết liên quan

Springboot java EN Cập nhật 2026-08-14

BookstoreApiApplication.java

BookstoreApiApplication.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/BookstoreApiApplication.java).

Đọc bài viết →
Springboot java EN Cập nhật 2026-08-14

DataInitializer.java

DataInitializer.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/DataInitializer.java).

Đọc bài viết →
Springboot java EN Cập nhật 2026-08-14

SecurityConfig.java

SecurityConfig.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/config/SecurityConfig.java).

Đọc bài viết →
Springboot java EN Cập nhật 2026-08-14

AuthController.java

AuthController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/AuthController.java).

Đọc bài viết →
Springboot java EN Cập nhật 2026-08-14

BookController.java

BookController.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/controller/BookController.java).

Đọc bài viết →
Springboot java EN Cập nhật 2026-08-14

ApiErrorResponse.java

ApiErrorResponse.java — java source code from the Springboot learning materials (Springboot/bookstore-api/src/main/java/com/example/bookstore/dto/ApiErrorResponse.java).

Đọc bài viết →