【发布时间】:2015-05-02 01:45:48
【问题描述】:
我正在使用 Spring Boot 并尝试使用 Spring Data REST 在实体之间实现多对多关系,其中不会创建依赖 Author 实体的重复项。
给定以下代码,当我发布带有作者的初始书时,创建了作者,创建了书,并创建了关系(查找表条目)。当我以同一作者发布第二本书时,会创建第二本书并尝试创建第二作者,但由于作者姓名的唯一性限制而失败。
我希望/希望发生的是,创建了第二本书,并创建了一个将第二本书与原始作者记录相关联的条目,而不是试图创建第二个/重复作者。
@Entity(name = 'book')
class Book {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
long id
...
@ManyToMany(fetch = FetchType.EAGER, cascade = [CascadeType.ALL])
@JoinTable(name = 'books_authors', joinColumns = @JoinColumn(name = 'book_id'),
inverseJoinColumns = @JoinColumn(name = 'author_id'))
@RestResource(exported = false)
Set<Author> authors
}
@Entity(name = 'author')
@ToString
class Author {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
long id
@Column(nullable = false, unique = true)
String fullName
@ManyToMany(mappedBy = "authors")
Set<Book> books
}
@RepositoryRestResource(collectionResourceRel = "authors", path = "authors")
interface AuthorRepository extends PagingAndSortingRepository<Author, Long> { }
@RepositoryRestResource(collectionResourceRel = "books", path = "books")
interface BookRepository extends PagingAndSortingRepository<Book, Long> { }
$ curl -i -X POST -H "Content-Type:application/json" -d '{ "title" : "Book One", "authors" { "fullName": "AuthorName"} }' ....
HTTP/1.1 201 Created
$ curl -i -X POST -H "Content-Type:application/json" -d '{ "title" : "Book Two", "authors" { "fullName": "AuthorName"} }' ....
第二个帖子由于尝试使用重复的fullName 创建新作者而失败。
我已经使用 Spring Data 实现了相同的关系,但没有使用 Spring Data REST。在其中,我有控制器和服务,并且能够在 createBook(Book book) 方法中覆盖它。但是使用 Spring Data REST,我没有要实现的服务。我尝试在AbstractRepositoryEventListener<Book>#onBeforeCreate() 中实现相同的逻辑,但最终出现了分离实体问题。
这似乎是我应该能够仅使用 JPA 关系定义来处理的事情,但我似乎无法做到。
【问题讨论】:
标签: rest jpa spring-data spring-data-rest