[英]JpaRepository not updating entity
As far as I undestood, JpaRepository save() method should update my entity in database.据我所知, JpaRepository save() 方法应该更新我在数据库中的实体。
I have a table in MySQL called REF_PERIOD with two columns only: code_id, which is INT and Primary Key, and code_name, which is VARCHAR.我在 MySQL 中有一个名为 REF_PERIOD 的表,只有两列:code_id,它是 INT 和主键,以及 code_name,它是 VARCHAR。
This is my Entity:这是我的实体:
@Data
@Entity
@Table(name = "REF_PERIOD")
public class PayRefPeriod {
@Id
@Column(name = "code_id")
private int codeId;
@Column(name = "code_name", length = 254, nullable = false)
private String codeName;
}
My Repository:我的存储库:
@Repository
public interface PayRefPeriodRepository extends JpaRepository<PayRefPeriod, Integer> {
}
And the Controller:和控制器:
@Slf4j
@RestController
@RequestMapping("/api")
public class PayRefPeriodController {
@Autowired
private PayRefPeriodRepository payRefPeriodRepository;
// Get all pay reference periods
@GetMapping("/payrefperiods")
public List<PayRefPeriod> getAllPayRefPeriod() {
return payRefPeriodRepository.findAll();
}
// Create a new pay reference period
@PostMapping("/payrefperiods")
public PayRefPeriod createPayRefPeriod(@Valid @RequestBody PayRefPeriod payRefPeriod) {
return payRefPeriodRepository.save(payRefPeriod);
}
// Get a single pay reference period
@GetMapping("/payrefperiods/{id}")
public PayRefPeriod PayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {
return payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
}
// Update a pay reference period
@PutMapping("/payrefperiods/{id}")
public PayRefPeriod updatePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId,
@Valid @RequestBody PayRefPeriod payRefPeriodDetails) {
PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
payRefPeriod.setCodeName(payRefPeriodDetails.getCodeName());
log.debug(payRefPeriod.toString());
return payRefPeriodRepository.save(payRefPeriod);
}
// Delete a pay reference period
@DeleteMapping("/payrefperiods/{id}")
public ResponseEntity<?> deletePayRefPeriod(@PathVariable(value = "id") int payRefPeriodId) {
PayRefPeriod payRefPeriod = payRefPeriodRepository.findById(payRefPeriodId)
.orElseThrow(() -> new ResourceNotFoundException("PayRefPeriod", "id", payRefPeriodId));
payRefPeriodRepository.delete(payRefPeriod);
return ResponseEntity.ok().build();
}
}
I expect the updatePayRefPeriod method to update my entity (which has Id 0 in MySQL database), however it throws an exception: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'.我希望 updatePayRefPeriod 方法更新我的实体(它在 MySQL 数据库中的 Id 为 0),但是它会引发异常:java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'。
What I'm doing wrong?我做错了什么?
I suppose it might be a mysql driver specific limitation that for java primitive type int
when we use it for identifier.我想这可能是 mysql 驱动程序特定的限制,当我们将它用作标识符时,对于 java 原始类型int
。 I suggest you change the type of the codeId
to its boxed object type Integer
.我建议您将codeId
的类型更改为其装箱对象类型Integer
。
@Id
@Column(name = "code_id")
private Integer codeId;
Thus the underlying hibernate can understand the difference between a null identifier and not null but 0 valued identifier when it generates the corresponding update queries.因此,底层休眠在生成相应的更新查询时可以理解空标识符和非空但值为 0 的标识符之间的区别。
Try adding sequenceGenerator and GeneratedValue to your id column.尝试将 sequenceGenerator 和 GeneratedValue 添加到您的 id 列。
@Data
@Entity
@Table(name = "REF_PERIOD")
public class PayRefPeriod {
@SequenceGenerator(name = "generator", sequenceName = "REF_PERIOD_ID_SEQ")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "generator")
@Id
@Column(name = "code_id")
private int codeId;
@Column(name = "code_name", length = 254, nullable = false)
private String codeName;
} }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.