如何为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
相关产品推荐
相关产品推荐

