I have an n:n relationship in DB:
Here is the entity for question:
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;
}
}
Here is the entity for questionnaire:
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;
}
}
Here the entity for intermediate table:
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 class:
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;
}
}
I'm using Spring Data Rest to create a resource for each entity:
- /question
- /questionnaire
- /questionnaireQuestion
I can create a question (for example) by:
curl -i -X POST -H "Content-Type:application/json" http://localhost/question -d '{"text":"bla bla", "detail_text": "bla bla"}'
But when a try to relate question with questionnaire by creating a questionnaire_question row doing this:
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
I get this error: "MySQL server version for the right syntax to use near 'order, start_date, question_id, questionnaire_id) values (null, '1', null, null,"
question_id and questionnaire_id are void. Furthermore, the fields should be scaped with character "`". I'm using "MySQL5InnoDBDialect".
What I'm doing wrong? :-(
Edited
"order" y a reserved word in MySQL, I changed the field 'order' for 'position', but I still having the void FK problem:
{"cause":{"cause":{"cause":null,"message":"Column 'question_id' cannot be null"},"message":"Column 'question_id' cannot be null"},"message":"Column 'question_id' cannot be null; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: Column 'question_id' cannot be null"}