如何通过Spring Data Rest的POST

时间:2015-05-07 10:32:43

标签: java mysql spring hibernate spring-data-rest

我在DB中有一个n:n的关系:

NtoNrelatinship

以下是问题的实体:

package data.entity;

import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "question")
public class Question implements Serializable {

private int id;
private String text;
private String detailText;
private String helpNotes;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false, insertable = true, updatable = true)
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

private Set<QuestionnaireQuestion> questionnaireQuestions = new HashSet<QuestionnaireQuestion>(0);

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.question", cascade=CascadeType.ALL)
public Set<QuestionnaireQuestion> getQuestionnaireQuestions() {
    return this.questionnaireQuestions;
}

public void setQuestionnaireQuestions(Set<QuestionnaireQuestion> questionnaireQuestions) {
    this.questionnaireQuestions = questionnaireQuestions;
}

@Basic
@Column(name = "text", nullable = true, insertable = true, updatable = true, length = 45)
public String getText() {
    return text;
}

public void setText(String text) {
    this.text = text;
}

@Basic
@Column(name = "detail_text", nullable = true, insertable = true, updatable = true, length = 45)
public String getDetailText() {
    return detailText;
}

public void setDetailText(String detailText) {
    this.detailText = detailText;
}

@Basic
@Column(name = "help_notes", nullable = true, insertable = true, updatable = true, length = 45)
public String getHelpNotes() {
    return helpNotes;
}

public void setHelpNotes(String helpNotes) {
    this.helpNotes = helpNotes;
}

}

以下是调查问卷的实体:

package data.entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name="questionnaire")
public class Questionnaire extends CommunicationEvent implements java.io.Serializable
{

private Set<QuestionnaireQuestion> questionnaireQuestions = new HashSet<QuestionnaireQuestion>(0);

@OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.questionnaire", cascade=CascadeType.ALL)
public Set<QuestionnaireQuestion> getQuestionnaireQuestions() {
    return this.questionnaireQuestions;
}

public void setQuestionnaireQuestions(Set<QuestionnaireQuestion> questionnaireQuestions) {
    this.questionnaireQuestions = questionnaireQuestions;
}

}

这里是中间表的实体:

package data.entity;

import javax.persistence.*;
import java.sql.Timestamp;

@Entity
@Table(name = "questionnaire_question")
@AssociationOverrides({
    @AssociationOverride(name = "pk.questionnaire",
            joinColumns = @JoinColumn(name = "questionnaire_id")),
    @AssociationOverride(name = "pk.question",
            joinColumns = @JoinColumn(name = "question_id"))})
public class QuestionnaireQuestion {

private QuestionnaireQuestionPK pk = new QuestionnaireQuestionPK();
private String order;
private Timestamp startDate;
private Timestamp endDate;

@EmbeddedId
public QuestionnaireQuestionPK getPk() {
    return pk;
}

public void setPk(QuestionnaireQuestionPK pk) {
    this.pk = pk;
}

@Basic
@Column(name = "order", nullable = true, insertable = true, updatable = true, length = 45)
public String getOrder() {
    return order;
}

public void setOrder(String order) {
    this.order = order;
}

@Basic
@Column(name = "start_date", nullable = true, insertable = true, updatable = true)
public Timestamp getStartDate() {
    return startDate;
}

public void setStartDate(Timestamp startDate) {
    this.startDate = startDate;
}

@Basic
@Column(name = "end_date", nullable = true, insertable = true, updatable = true)
public Timestamp getEndDate() {
    return endDate;
}

public void setEndDate(Timestamp endDate) {
    this.endDate = endDate;
}

}

PK课程:

package data.entity;

import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
import java.io.Serializable;

@Embeddable
public class QuestionnaireQuestionPK implements Serializable {

private Question question;
private Questionnaire questionnaire;

@ManyToOne
public Question getQuestion() {
    return question;
}

public void setQuestion(Question question) {
    this.question = question;
}

@ManyToOne
public Questionnaire getQuestionnaire() {
    return questionnaire;
}

public void setQuestionnaire(Questionnaire questionnaire) {
    this.questionnaire = questionnaire;
}

}

我使用Spring Data Rest为每个实体创建资源:

  • /问题
  • /问卷
  • / questionnaireQuestion

我可以通过以下方式创建一个问题(例如)

curl -i -X POST -H "Content-Type:application/json" http://localhost/question -d '{"text":"bla bla", "detail_text": "bla bla"}'

但是,当试图通过创建一个问卷调查行来解决问题和问卷时:

curl -i -X POST -H "Content-Type:application/json" -d '{ "questionnaire": "http://localhost:8080/questionnaire/1", "question": "http://localhost/question/1", "order": 1 }' http://localhost/questionnaireQuestion

我收到此错误:&#34; MySQL服务器版本的正确语法使用near&#39; order,start_date,question_id,questionnaire_id)值(null,&#39; 1&#39;,null,null &#34;

question_id和questionnaire_id无效。此外,字段应该用字符&#34;`&#34;。我正在使用&#34; MySQL5InnoDBDialect&#34;。

我做错了什么? : - (

被修改

&#34;为了&#34;在MySQL中保留一个字,我改变了字段&#39; order&#39;对于&#39; position&#39;,但我仍然有虚假的FK问题:

{&#34;原因&#34;:{&#34;原因&#34;:{&#34;原因&#34;:null,&#34;消息&#34;:&#34;列& #39; question_id&#39;不能为空&#34;},&#34;消息&#34;:&#34;列&#39; question_id&#39;不能为空&#34;},&#34;消息&#34;:&#34;列&#39; question_id&#39;不能为空; SQL [不适用];约束[null];嵌套异常是org.hibernate.exception.ConstraintViolationException:Column&#39; question_id&#39;不能为空&#34;}

0 个答案:

没有答案