mk_*_*_89 5 java hibernate spring-boot
我理解默认情况下该CrudRepository.save方法基于主键插入和更新。
考虑以下实体
@Entity
public class BookEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Basic
@Column(name = "isbn", unique = true)
private String isbn;
@Basic
@Column(name = "title")
private String title;
@Basic
@Column(name = "author")
private String author;
@Basic
@Column(name = "publication_date")
private Date publicationDate;
@Basic
@Column(name = "rank")
private Integer rank;
}
Run Code Online (Sandbox Code Playgroud)
因为我不能在表中拥有相同 isbn 的书,而且我不想担心生成 id 我通常将以下 json 发布到一个端点
{
"isbn": "10932011",
"title": "harry",
"author": "jk",
"publicationDate": "2018-10-10",
"rank": 1000
}
它返回以下带有自动生成的 ID
{
"id": 3,
"isbn": "10932011",
"title": "harry",
"author": "jk",
"publicationDate": "2018-10-10T00:00:00.000+0000",
"rank": 1000
}
如果我使用相同的 isbn 进行第二次调用,我将收到约束错误
{
"isbn": "10932011",
"title": "harry",
"author": "jk3",
"publicationDate": "2018-10-10",
"rank": 1000
}
但实际上我想用相同的 isbn 更新这本书,而不必在 post json 中指定自动生成的 id,因为这对我来说并不重要。有没有办法在不必向服务类添加逻辑的情况下做到这一点?
您可以获取BookEntity、更改并保存。
由于您的内容isbn是独一无二的,因此您可以执行以下操作:
BookEntity book = bookRepository.findByIsbn(isbn);
book.setWhateverFieldYouWant(value);
bookRepository.save(book);.
Run Code Online (Sandbox Code Playgroud)
或者其他解决方案
@Query您可以在以下位置创建带有注释的方法BookRepository:
@Query("UPDATE BookEntity b SET b.whateverField = :value WHERE b.isbn = :isbn")
void updateBook(@Param("value") String value, @Param("isbn") String isbn);
Run Code Online (Sandbox Code Playgroud)
并从服务中调用它:
bookRepository.updateBook(value, isbn);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3193 次 |
| 最近记录: |