不得执行语句; sql [n/a];约束[primary];嵌套的异常是org.hibernate.exception.constraintviolationException

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

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; } }

这是我的engineercontrollerclass

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值折叠。
同样,如果您不断尝试插入新的工具
java mysql mariadb postman
1个回答
2
投票
要解决问题,您可以将ID生成策略更改为

@GeneratedValue(strategy = GenerationType.IDENTITY)

或继续尝试插入,直到Hibernate达到非使用ID值(如果您想保留相同的生成策略)

org.hibernate.exception.ConstraintViolationException,

例外约束违规意味着您将数据库字段设置为具有非NULL,唯一等的数据库字段。数据库在将数据插入表中之前先检查数据。如果有任何条件不匹配,您将获得约束ViolationException。
在您的情况下,您有主要键违规。因此,是否存在“ ID = 68”的数据库表工程师。如果有余地,请删除行。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.