You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Book、Client、Order实体创建对应JPA仓库与业务服务

现有代码问题修正及实现方案

一、实体类问题修正

1. Book实体类

原getID()方法命名不符合JPA规范,修改为getId()即可:

package com.mile.pc.java8.book_api_jpa.DTO;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String name;
    private String type;
    private boolean available;

    protected Book() {}

    public Book(String name, String type, boolean available) {
        super();
        this.name = name;
        this.type = type;
        this.available = available;
    }
    // 修正getter命名
    public Long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    public String getType() {
        return type;
    }
    public boolean isAvailable() {
        return available;
    }
    // 建议补充setter方法,否则无法更新字段
    public void setName(String name) {
        this.name = name;
    }
    public void setType(String type) {
        this.type = type;
    }
    public void setAvailable(boolean available) {
        this.available = available;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + ", type=" + type + ", available=" + available + "]";
    }
}

2. Order实体类

原构造函数包含自增主键id,无需手动传入,同时统一主键包装类型:

package com.mile.pc.java8.book_api_jpa.DTO;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    private String customerName;
    
    protected Order() {}
    // 去掉构造函数的id参数,主键自增无需手动传入
    public Order(String customerName) {
        super();
        this.customerName = customerName;
    }
    
    public Integer getId() {
        return id;
    }
    public String getCustomerName() {
        return customerName;
    }
    // 建议补充setter
    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }
    @Override
    public String toString() {
        return "Order [id=" + id + ", customerName=" + customerName + "]";
    }
}

3. Client实体类

String类型的邮箱作为主键不能使用自增策略,删除@GeneratedValue注解:

package com.mile.pc.java8.book_api_jpa.DTO;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "clients")
public class Client {
    @Id
    // 去掉自增注解,邮箱本身作为主键
    private String clientEmail;
    private String clientName;
     
    protected Client() {}

    public Client(String clientEmail, String clientName) {
        super();
        this.clientEmail = clientEmail;
        this.clientName = clientName;
    }

    public String getClientEmail() {
        return clientEmail;
    }

    public String getClientName() {
        return clientName;
    }
    // 建议补充setter
    public void setClientName(String clientName) {
        this.clientName = clientName;
    }
    @Override
    public String toString() {
        return "Client [clientEmail=" + clientEmail + ", clientName=" + clientName + "]";
    }
}

二、Repository层修正实现

注意:@EnableJpaRepositories是全局配置注解,仅需加在Spring Boot启动类或JPA配置类上,不需要加在Repository接口上;同时删除接口内自定义的内存集合变量,Spring Data JPA会自动实现CRUD方法,另外需保证CrudRepository的第二个泛型参数和实体主键类型一致。

1. BookRepository

package com.mile.pc.java8.book_api_jpa.DTO.repo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.mile.pc.java8.book_api_jpa.DTO.Book;
import java.util.List;

@Repository
public interface BookRepository extends CrudRepository<Book, Long> {
    // 可按业务需求扩展自定义查询,Spring Data JPA会自动根据方法名生成SQL
    List<Book> findByAvailable(boolean available);
    List<Book> findByType(String type);
}

2. OrderRepository

package com.mile.pc.java8.book_api_jpa.DTO.repo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.mile.pc.java8.book_api_jpa.DTO.Order;
import java.util.List;

@Repository
// 主键是Integer,泛型第二个参数改为Integer
public interface OrderRepository extends CrudRepository<Order, Integer> {
    List<Order> findByCustomerName(String customerName);
}

3. ClientRepository

package com.mile.pc.java8.book_api_jpa.DTO.repo;

import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.mile.pc.java8.book_api_jpa.DTO.Client;

@Repository
// 主键是String类型邮箱,泛型第二个参数改为String
public interface ClientRepository extends CrudRepository<Client, String> {
}

三、Service层实现

每个服务类注入对应Repository,封装业务操作即可,示例如下:

1. BookService

package com.mile.pc.java8.book_api_jpa.DTO.repo.service;

import com.mile.pc.java8.book_api_jpa.DTO.Book;
import com.mile.pc.java8.book_api_jpa.DTO.repo.BookRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Service
public class BookService{
    private final BookRepository bookRepository;

    // 构造注入,Spring 4.3+无需加@Autowired注解
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    // 新增/更新图书
    public Book saveBook(Book book) {
        return bookRepository.save(book);
    }

    // 根据id查询图书
    public Optional<Book> getBookById(Long id) {
        return bookRepository.findById(id);
    }

    // 查询所有图书
    public List<Book> getAllBooks() {
        return (List<Book>) bookRepository.findAll();
    }

    // 删除图书
    public void deleteBook(Long id) {
        bookRepository.deleteById(id);
    }

    // 按可用状态查询图书
    public List<Book> getAvailableBooks(boolean available) {
        return bookRepository.findByAvailable(available);
    }
}

2. OrderService

package com.mile.pc.java8.book_api_jpa.DTO.repo.service;

import com.mile.pc.java8.book_api_jpa.DTO.Order;
import com.mile.pc.java8.book_api_jpa.DTO.repo.OrderRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Service
public class OrderService {
    private final OrderRepository orderRepository;

    public OrderService(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    public Order saveOrder(Order order) {
        return orderRepository.save(order);
    }

    public Optional<Order> getOrderById(Integer id) {
        return orderRepository.findById(id);
    }

    public List<Order> getAllOrders() {
        return (List<Order>) orderRepository.findAll();
    }

    public void deleteOrder(Integer id) {
        orderRepository.deleteById(id);
    }
}

3. ClientService

package com.mile.pc.java8.book_api_jpa.DTO.repo.service;

import com.mile.pc.java8.book_api_jpa.DTO.Client;
import com.mile.pc.java8.book_api_jpa.DTO.repo.ClientRepository;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Optional;

@Service
public class ClientService {
    private final ClientRepository clientRepository;

    public ClientService(ClientRepository clientRepository) {
        this.clientRepository = clientRepository;
    }

    public Client saveClient(Client client) {
        return clientRepository.save(client);
    }

    public Optional<Client> getClientByEmail(String email) {
        return clientRepository.findById(email);
    }

    public List<Client> getAllClients() {
        return (List<Client>) clientRepository.findAll();
    }

    public void deleteClient(String email) {
        clientRepository.deleteById(email);
    }
}

四、补充配置

确保Spring Boot启动类上添加@EnableJpaRepositories注解,同时在application.yml/application.properties中配置好数据库连接、JPA相关参数即可正常使用。

内容的提问来源于stack exchange,提问作者Mile Stanislavov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:27:00