2015-04-01 96 views
3

我有2个实体春数据休息应用双向@多对一/ @一对多的关系:如何更新通过REST从反侧

@Entity 
public class Question { 
    ... 
    @OneToMany(mappedBy = "question") 
    private Set<Answer> answers = new HashSet<>(); 
    ... 
} 

@Entity 
public class Answer { 
    ... 
    @ManyToOne 
    Question question; 
    ... 
} 

和Spring数据仓库为两个实体:

@RepositoryRestResource 
public interface QuestionRepository extends  PagingAndSortingRepository<Question, Long> { 
} 

@RepositoryRestResource 
public interface AnswerRepository extends PagingAndSortingRepository<Answer,  Long> { 

} 

假设我有问题与id 1和两个答案与ids 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 

春数据处理休息与ID 1获取问题的情况下,加入了两个答案到其设置和调用休眠有关问题的合并最后一个卷曲的请求。

问题是,这些更改被忽略,因为它们是由逆(不是关系的所有者)一方制成的。据我所知,你不能在冬眠期间改变拥有者或在双方之间进行一对多/多对一的关系更新。

这是否意味着我将不得不逐一更新答案? 是否有可能配置Spring Data Rest,以便它将更新来自所有者的关系,以便通过休眠来保持它?

+0

JPA中的关系始终是单向的,除非您在两个方向上将父项与子项相关联。 – 2015-04-02 05:40:12

+0

你可以发布更具体的你想要的东西吗? – 2015-04-02 05:40:40

+0

不应该为'@ OneToMany'注释添加一个'cascade'属性吗? – zeroflagL 2015-04-02 18:41:17

回答

0

我是新来春数据Rest.The原因(我认为)春数据休息不这样做如下:

为对象的PUT请求意味着它应该更新有什么你给它(例如这个问题的两个答案)。但是,如果稍后决定在uri列表上放置两个不同的Answer对象,则前两个Answer对象应指向哪个位置?它们是否应该设置为空?如果您的模型对应答实体中的问题字段表示@NotNull?

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