我正在开发一个 Spring Boot 应用程序,我需要实现一个 POST 请求来创建一个新的 Book 对象。图书的唯一标识符 (nombreLibro) 由客户端提供,并且在数据库中需要是唯一的。
这是我的 Book 实体和控制器中的 createBook 方法的代码:
@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 创建书籍时,我收到 500 内部服务器错误。我相信这是因为 Spring 正在尝试更新现有的书籍而不是创建新的书籍。
当数据库中不存在 nombreLibro 时,如何修改 createBook 方法来创建新书?
当您使用 Spring Data JPA 时,它会检查主键值(带有 @Id 注释的字段的值)来决定是否应该更新或插入。
如果存在值,则表示更新。如果不存在值,则为插入。
由于在您的情况下
nombreLibro
是一个功能字段而不是主要字段,您可以创建一个新的 id
字段,该字段将为您的 nombreLibro
存储唯一的 UUID 和常规字段。
更新时,您可以获得
id
的 nombreLibro
值并使用它。
@Table("t_catalogo")
public class Book {
@Id
@Column("id")
private String id = UUID.randomUUID().toString();
@Column("nombreLibro")
private String nombreLibro;
// other fields, constructors, getters and setters
}