我在Spring Data Rest应用程序中有2个实体:
@Entity
public class Question {
...
@OneToMany(mappedBy = "question")
private Set<Answer> answers = new HashSet<>();
...
}
@Entity
public class Answer {
...
@ManyToOne
Question question;
...
}
和两个实体的Spring Data存储库:
@RepositoryRestResource
public interface QuestionRepository extends PagingAndSortingRepository<Question, Long> {
}
@RepositoryRestResource
public interface AnswerRepository extends PagingAndSortingRepository<Answer, Long> {
}
假设我有id 1和两个带有id 1和2的Answers的问题。 然后我可以像这样链接他们:
curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/questions/1" http://localhost:8080/answers/1/question
curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/questions/1" http://localhost:8080/answers/2/question
但不是这样的:
curl -v -X PUT -H "Content-Type:text/uri-list" -d $'http://localhost:8080/answers/1\nhttp://localhost:8080/answers/2' http://localhost:8080/questions/1/answers
Spring Data Rest通过获取id为1的Question实例处理最后一个curl请求,将其两个答案添加到其集合并在Question上调用hibernate merge。
问题是忽略了这些变化,因为它们是由逆(不是关系的所有者)方面构成的。据我所知,你不能改变所有者,也不能让它在hibernate中以一对多/多对一的关系从双方更新。
这是否意味着我必须逐个更新答案集? 是否可以配置Spring Data Rest以便它将更新来自所有者方的关系,以便它被hibernate持久化?
答案 0 :(得分:0)
我是Spring Data Rest的新手。我认为Spring Data Rest没有这样做的原因如下:
对象的PUT请求意味着它应该被更新以获得你给它的东西(例如问题的两个答案)。但是,如果您以后决定在uri列表中输入两个不同的Answer对象,那么前两个Answer对象应该指向哪里?它们应该设置为空吗?如果您的模型在Answer实体中的问题字段中说@NotNull怎么办?
总之,更新答案以指向不同的问题已经明确定义,但更新问题的答案列表的定义不是很明确,因此Spring Data Rest避免了这一点。这当然是估计的猜测,我没有看过Spring Data Rest背后的代码