我最近开始学习 Spring Boot,并在休息控制器中遇到了 PostMapping 的一些问题。执行 postmapping 端点时,SQL 表会自动从“employees”更改为“employee_seq”,并抛出一个错误,指出表不存在。
这是我的 Employee 实体类,我提到了表名“employee”
@Entity
@Table(name = "employee")
public class Employee {
// define fields
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private int id;
@Column(name = "first_name")
private String firstName;
@Column(name = "last_name")
private String lastName;
@Column(name = "email")
private String email;
// define constructors
public Employee() {
}
public Employee(String firstName, String lastName, String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
// define getters / setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
// define a toString() to display an employee
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
'}';
}
}
这是接口 EmployeeDAO 的 DAO 实现类
@Repository
public class EmployeeDAOJpaImpl implements EmployeeDao{
//define fields for entity manager
private EntityManager entityManager;
// setup constructor injection
@Autowired
public EmployeeDAOJpaImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public List<Employee> findAll() {
// create a query
TypedQuery<Employee> query = entityManager.createQuery("from Employee", Employee.class);
// execute the query and get the result list
List<Employee> employees = query.getResultList();
// return the result
return employees;
}
@Override
public Employee findById(int id) {
return entityManager.find(Employee.class, id);
}
@Override
public Employee save(Employee emp) {
Employee dbEmp = entityManager.merge(emp);
return dbEmp;
}
@Override
public void deleteById(int id) {
Employee emp = entityManager.find(Employee.class, id);
entityManager.remove(emp);
}
}
EmployeeService接口的服务实现类
@Service
public class EmployeeServiceImpl implements EmployeeService{
private EmployeeDao employeeDao;
@Autowired
public EmployeeServiceImpl(EmployeeDao employeeDao) {
this.employeeDao = employeeDao;
}
@Override
public List<Employee> findAll() {
return employeeDao.findAll();
}
@Override
@Transactional
public Employee findById(int id) {
return employeeDao.findById(id);
}
@Transactional
@Override
public Employee save(Employee emp) {
return employeeDao.save(emp);
}
@Transactional
@Override
public void deleteById(int id) {
employeeDao.deleteById(id);
}
}
这是 REST 控制器
@RestController
@RequestMapping("/api")
public class EmployeeRestController {
/*
The rest controller is only concerned with the EmployeeService and nothing else.
*/
// using the service view to get the final view
private EmployeeService employeeService;
@Autowired
public EmployeeRestController (EmployeeService employeeService) {
this.employeeService = employeeService;
}
// expose the "/employees" and return the list of employees
@GetMapping("/employees")
public List<Employee> findAll() {
return employeeService.findAll();
}
@GetMapping("/employees/{empId}")
public Employee findById(@PathVariable int empId) {
Employee emp = employeeService.findById(empId);
if(emp == null) throw new RuntimeException("Employee id not found" + empId);
return emp;
}
@PostMapping("/employees")
public Employee addEmployee(@RequestBody Employee emp) {
emp.setId(0);
Employee dbEmp = employeeService.save(emp);
return dbEmp;
}
}
我创建了DAO层和Service层,所有事务操作都是从Service层执行的。在后映射中,我使用 ResponseEntity 中的“merge()”函数执行“addEmployee”和“updateEmployee”功能。请帮我解决这个问题。
我将一个 JSON 对象传递给 POST 端点,它应该返回新创建或更新的员工记录。相反,它抛出一个错误,指出 SQLException ,表不存在,因为代码试图访问“employee_seq”,但我从未提到过这个表。
问题可能取决于您的 application.properties 文件
的配置这是 MySQL 数据库的示例配置:
# Use one of create/update/create-update
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/employee?createDatabaseIfNotExist=true
spring.datasource.username=root //your db user name
spring.datasource.password=root //your db user password
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
#If your MySql version 5 then use MySQL5Dialect
# Enable spring data repos
spring.data.jpa.repositories.enabled=true
spring.jpa.show-sql=true
spring.jpa.database=mysql
请检查这些设置并进行必要的更改以匹配您的环境。
此外,如果您可以分享当前的 application.properties 配置以及您遇到的特定控制台错误消息,这将有助于解决问题。