SQL 表名称在 PostMapping 期间自动更改

问题描述 投票:0回答:1

我最近开始学习 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”,但我从未提到过这个表。

java mysql spring spring-boot jpa
1个回答
0
投票

问题可能取决于您的 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 配置以及您遇到的特定控制台错误消息,这将有助于解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.