I使用Java/Spring Boot创建了一个CRUD RESTFUL API应用程序。我有一个Mariadb,其中包含员工列表和内部相关数据。我正在使用MySQL Workbench作为我的SQL客户端。 运行Spring Boot应用程序时没有错误。我的数据库中没有错误。当我在数据库中获取所有工程师的API时,没有错误。 我的“ get”请求正常工作;但是,“邮政”没有。我无法创建一个新员工,而无需直接使用MySQL WB插入数据库。 我希望能够通过
Postman创建一个新员工。,您可以看到抛出了一个约束violationException。相反是我的主要钥匙,即“ id”。我将其设置为在MySQLWB.
中自动插入。在这里是我的工程师类的代码:
package engineermanagement.model;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
@Entity
@Table(name = "Engineers")
@EntityListeners(AuditingEntityListener.class)
public class Engineer {
private Long id;
private String firstName;
private String lastName;
private String sid;
private String email;
private String manager;
private Boolean teamLead;
private String groupName;
private String shift;
private int startTime;
private int endTime;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "first_name", nullable = false)
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@Column(name = "last_name", nullable = false)
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Column(name = "eid", nullable = false)
public String getEid() {
return eid;
}
public void setEid(String eid) {
this.sid = eid;
}
@Column(name = "email", nullable = false)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name = "manager", nullable = false)
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
@Column(name = "teamlead", nullable = false)
public Boolean getTeamLead() {
return teamLead;
}
public void setTeamLead(Boolean teamLead) {
this.teamLead = teamLead;
}
@Column(name = "group_name", nullable = false)
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
@Column(name = "shift", nullable = false)
public String getShift() {
return shift;
}
public void setShift(String shift) {
this.shift = shift;
}
@Column(name = "start_time", nullable = false)
public int getStartTime() {
return startTime;
}
public void setStartTime(int startTime) {
this.startTime = startTime;
}
@Column(name = "end_time", nullable = false)
public int getEndTime() {
return endTime;
}
public void setEndTime(int endTime) {
this.endTime = endTime;
}
}
package jpmchase.controller;
import jpmchase.exception.*;
import jpmchase.model.Engineer;
import jpmchase.repository.EngineerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/v1")
public class EngineerController {
@Autowired
private EngineerRepository engineerRepository;
@GetMapping("/engineers")
public List<Engineer> getAllEngineers() {
return engineerRepository.findAll();
}
@GetMapping("/engineers/{id}")
public ResponseEntity<Engineer> getEngineerById(
@PathVariable(value = "id") Long engineerId) throws ResourceNotFoundException {
Engineer engineer = engineerRepository.findById(engineerId)
.orElseThrow(() -> new ResourceNotFoundException("Engineer not found on :: "+ engineerId));
return ResponseEntity.ok().body(engineer);
}
@PostMapping("/engineers")
public Engineer createEngineer(@Valid @RequestBody Engineer engineer) {
return engineerRepository.save(engineer);
}
@PutMapping("/engineers/{id}")
public ResponseEntity<Engineer> updateEngineer(
@PathVariable(value = "id") Long engineerId,
@Valid @RequestBody Engineer engineerDetails) throws ResourceNotFoundException {
Engineer engineer = engineerRepository.findById(engineerId)
.orElseThrow(() -> new ResourceNotFoundException("Engineer not found on :: "+ engineerId));
engineer.setId(engineerDetails.getId());
engineer.setFirstName(engineerDetails.getFirstName());
engineer.setLastName(engineerDetails.getLastName());
engineer.setSid(engineerDetails.getSid());
engineer.setEmail(engineerDetails.getEmail());
engineer.setTeamLead(engineerDetails.getTeamLead());
engineer.setManager(engineerDetails.getManager());
engineer.setShift(engineerDetails.getShift());
engineer.setStartTime(engineerDetails.getStartTime());
engineer.setEndTime(engineerDetails.getEndTime());
// engineer.setUpdatedAt(new Date());
final Engineer updatedEngineer = engineerRepository.save(engineer);
return ResponseEntity.ok(updatedEngineer);
}
@DeleteMapping("/engineers/{id}")
public Map<String, Boolean> deleteEngineer(
@PathVariable(value = "id") Long engineerId) throws Exception {
Engineer engineer = engineerRepository.findById(engineerId)
.orElseThrow(() -> new ResourceNotFoundException("Engineer not found on :: "+ engineerId));
engineerRepository.delete(engineer);
Map<String, Boolean> response = new HashMap<>();
response.put("deleted", Boolean.TRUE);
return response;
}
}
使用Postman,我正在尝试“发布”新的“测试”员工,但由于上述约束而失败。任何帮助将不胜感激... Full堆栈跟踪:
2019-01-11 15:26:50.605 WARN 15276 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000
2019-01-11 15:26:50.606 ERROR 15276 --- [nio-8080-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '68' for key 'PRIMARY'
2019-01-11 15:26:50.606 ERROR 15276 --- [nio-8080-exec-6] o.h.i.ExceptionMapperStandardImpl : HHH000346: Error during managed flush [org.hibernate.exception.ConstraintViolationException: could not execute statement]
2019-01-11 15:26:50.657 WARN 15276 --- [nio-8080-exec-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
我也有同样的问题,原因是
o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '68' for key 'PRIMARY'
.Hibernate试图为新的Engineer
生成一个ID,但是当它试图遵循由
@GeneratedValue(strategy = GenerationType.AUTO)
指定的生成策略时,它将获得已经存在的ID。 很可能发生这种情况,因为您将新的行添加到
启动器表中,该表与Hibernate的下一个生成ID值折叠。同样,如果您不断尝试插入新的工具
@GeneratedValue(strategy = GenerationType.IDENTITY)
或继续尝试插入,直到Hibernate达到非使用ID值(如果您想保留相同的生成策略)
org.hibernate.exception.ConstraintViolationException,
例外约束违规意味着您将数据库字段设置为具有非NULL,唯一等的数据库字段。数据库在将数据插入表中之前先检查数据。如果有任何条件不匹配,您将获得约束ViolationException。在您的情况下,您有主要键违规。因此,是否存在“ ID = 68”的数据库表工程师。如果有余地,请删除行。