【发布时间】:2015-06-06 09:37:17
【问题描述】:
我在 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 的答案。 然后我可以像这样链接它们:
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 上调用休眠合并。
问题在于更改被忽略,因为它们是从反向(不是关系的所有者)方面进行的。据我所知,您无法更改所有者或使其在休眠中以一对多/多对一关系从双方更新。
这是否意味着我必须逐一更新答案集? 是否可以配置 Spring Data Rest 以便它从所有者端更新关系以便它被休眠持久化?
【问题讨论】:
-
JPA 中的关系始终是单向的,除非您在两个方向上将父级与子级关联起来。
-
你能发布更具体的你想要什么吗?
-
你不应该在
@OneToMany注解中添加cascade属性吗? -
我的关系是双向的——答案中有问题的引用,问题中也有答案的引用。
-
一般的级联实现(任何类型的 org.hibernate.annotations.Cascade 或 javax.persistence.CascadeType)只有在实体已经被链接之后才会做任何事情,如果我没记错的话。
标签: spring spring-data-jpa spring-data-rest