我正在处理一个Sping Boot 应用程序,我需要实现一个POST请求来创建一个新的Book对象。Book的唯一标识符(nombreLibro)由客户端提供,它需要在数据库中是唯一的。
下面是我的Book实体和控制器中的Notebook方法的代码:
@Table("t_catalogo")
public class Book {
@Id
@Column("nombreLibro")
private String nombreLibro;
// other fields, constructors, getters and setters
}
@PostMapping("/{nombreLibro}")
public ResponseEntity<Void> createBook(@PathVariable String nombreLibro, @RequestBody Book newBook) {
Book savedBook = newBook;
savedBook.setNombreLibro(nombreLibro);
try {
bookRepository.save(savedBook);
return ResponseEntity.status(HttpStatus.CREATED).body(newBook);
} catch (DataIntegrityViolationException e) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("An error occurred while trying to save the book.");
}
}
字符串
当我尝试使用数据库中不存在的nombreLibro创建一个Book时,我得到一个500内部服务器错误。我相信这是因为Spring试图更新现有的Book,而不是创建一个新的。
当数据库中不存在命名Libro时,我如何修改我的Book方法来创建一个新的Book?
1条答案
按热度按时间q43xntqr1#
当您使用Spring Data JPA时,它会检查是否有primary key value(带有@Id annotation的字段的值)来决定是否应该更新或插入。
如果存在值,则为更新。如果不存在值,则为插入。
由于在您的情况下
nombreLibro
是一个功能字段而不是主字段,因此您可以创建一个新的id
字段,该字段将为您的nombreLibro
存储Unique UUID和常规字段。更新时,您可以获取
nombreLibro
的id
值并使用它。字符串