Spring Boot 3 與 Hibernate JPA 教學(三) Entity 與 Repository 

Spring Boot 3 搭配 JPA ,其中常用到的兩個類別 Entity 與 Repository 。

Entity : 對應到資料庫中的 table。

Repository : 對 table 進行,新修刪查。

Spring Boot 3 增加 Dao 的 package

前一篇文章,已經建立的 MyBook.java 的 Entity。

此篇增加 Repository : MyBookDao.java。

建立 package : com.example.myjpa.dao

建立 Java 的 interface: MyBookDao.java

package com.example.myjpa.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.myjpa.entity.MyBook;

@Repository
public interface MyBookDao  extends JpaRepository<MyBook, Long>{

}

Dao 中的基本功能

新增一個 RestController 進行測試。

建立 package : com.example.myjpa.action

建立 MyBookAction.java

Dao 中 insert 資料

package com.example.myjpa.action;

import java.time.LocalDate;
import java.util.HashMap;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.myjpa.dao.MyBookDao;
import com.example.myjpa.entity.MyBook;

@RestController
@RequestMapping("MyBook")
public class MyBookAction {
	
	@Autowired
	MyBookDao myBookDao;
	
	@GetMapping("insert")
	public Map insert() {
		Map rs = new HashMap();
		MyBook book = new MyBook();
		book.setName("第一本書");
		book.setPrice(100);
		book.setPublishingHouse("低一出版社");
		book.setPublicationDate(LocalDate.parse("2021-01-01"));
		book = myBookDao.save(book);
		rs.put("success", true);
		rs.put("id", book.getId());
		return rs;
	}

}

於瀏覽器上執行: http://localhost:8080/MyBook/insert

資料庫中查詢

Dao 中 查詢資料

以 PK 進行查詢,在 MyBookAction.java 增加 method

@GetMapping("queryOne")
	public Map queryOne() {
		Map rs = new HashMap();
		MyBook book =  myBookDao.getReferenceById(1L);
		rs.put("success", true);
		rs.put("book", book);
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/queryOne

結果,發生錯誤囉!!

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer

Spring Boot 3 使用 Hibernate JPA 中的 Entity 無法序列化(Json),導致錯誤

原因是因為 JPA 中的 @Entity 無法序列化成 Json ,因此需要 vo 來轉載資料到前端,輸出 Json。

新增 package : com.example.myjpa.vo

增加 MyBookVo.java

package com.example.myjpa.vo;

import java.time.LocalDate;

public class MyBookVo {

	
    private Long id;
 
    private String name;
    
    private int price;
    
    private LocalDate publicationDate;
    
    private String publishingHouse;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public LocalDate getPublicationDate() {
		return publicationDate;
	}

	public void setPublicationDate(LocalDate publicationDate) {
		this.publicationDate = publicationDate;
	}

	public String getPublishingHouse() {
		return publishingHouse;
	}

	public void setPublishingHouse(String publishingHouse) {
		this.publishingHouse = publishingHouse;
	}
}

修改 MyBookAction.java

@GetMapping("queryOne")
	public Map queryOne() {
		Map rs = new HashMap();
		MyBook book =  myBookDao.getReferenceById(1L);
		MyBookVo vo = new MyBookVo();
		BeanUtils.copyProperties(book, vo);//複製資料
		rs.put("success", true);
		rs.put("book", vo);
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/queryOne

Dao 中 update 資料

在 MyBookAction.java 增加 method ,將價格改為 200。

@GetMapping("update")
	public Map update() {
		Map rs = new HashMap();
		MyBook book = new MyBook();
		book.setId(1L);
		book.setName("第一本書");
		book.setPrice(200);
		book.setPublishingHouse("低一出版社");
		book.setPublicationDate(LocalDate.parse("2021-01-01"));
		book = myBookDao.save(book);
		rs.put("success", true);
		rs.put("id", book.getId());
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/update

查看資料庫中內容

Dao 中 delete 資料

在 MyBookAction.java 增加 method 。

	@GetMapping("delete")
	public Map delete() {
		Map rs = new HashMap();
		myBookDao.deleteById(1L);
		rs.put("success", true);
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/delete

查看資料庫中內容

確實資料已經被刪除了!