Spring hibernate CrudRepository 根据唯一约束使保存方法更新

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,因为这对我来说并不重要。有没有办法在不必向服务类添加逻辑的情况下做到这一点?

hts*_*ame 2

您可以获取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)