如何通过REST从反面更新双向@ ManyToOne / @ OneToMany关系

时间:2015-04-01 16:21:03

标签: spring spring-data-jpa spring-data-rest

我在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持久化?

1 个答案:

答案 0 :(得分:0)

我是Spring Data Rest的新手。我认为Spring Data Rest没有这样做的原因如下:

对象的PUT请求意味着它应该被更新以获得你给它的东西(例如问题的两个答案)。但是,如果您以后决定在uri列表中输入两个不同的Answer对象,那么前两个Answer对象应该指向哪里?它们应该设置为空吗?如果您的模型在Answer实体中的问题字段中说@NotNull怎么办?

总之,更新答案以指向不同的问题已经明确定义,但更新问题的答案列表的定义不是很明确,因此Spring Data Rest避免了这一点。这当然是估计的猜测,我没有看过Spring Data Rest背后的代码