使用Spring Data REST。如果您有oneToMany或ManyToOne关系,则PUT操作在“非拥有”实体上返回200,但实际上并未持续连接的资源。如何与Spring Data REST和JPA保持双向关系?
示例实体。
@Entity(name = 'author')
@ToString
class AuthorEntity implements Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
String fullName
@ManyToMany(mappedBy = 'authors')
Set<BookEntity> books
}
@Entity(name = 'book')
@EqualsAndHashCode
class BookEntity implements Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id
@Column(nullable = false)
String title
@Column(nullable = false)
String isbn
@Column(nullable = false)
String publisher
@ManyToMany(fetch = FetchType.LAZY, cascade = [CascadeType.ALL])
Set<AuthorEntity> authors
}
如果您有PagingAndSortingRepository
支持他们,你可以得到一本书,跟随作者的书链接,做一个PUT与URI一个作者与相关联的。你不能走另一条路。
如果你做一个作者一个GET,做一个穿上它的图书链接,响应返回200,但关系永远不会持久。
这是预期的行为?
双向关联必须手动维护在对象模型中,通常在setters内完成。 Spring Data REST默认使用字段访问。这意味着协会的变化不会在定义的协会的另一面反映出来。你有没有试过,在'@ PrePersist' /'@ PreUpdate'方法中触发同步?或切换到财产访问? –
我也投票解决双向关联。一个'Author'可以存在,没有'Book'。可以使用存储库方法'设置 BookRepository.findByAuthor(作者作者)'来检索'作者'的书籍。这样可以简化模型,因为您不必手动维护引用。 –
我可以看到一个库界面,您需要找到作者,然后查看它的书籍。如果没有双向关联,这将不被支持。不是管理实体关联的粉丝,如果它不是DATA REST的意图。感谢您的参与,对书籍作者进行过滤似乎是最好的方法。不要在任何可能的情况下保持单向。 :) – keaplogik