hibernate.PropertyValueException: not-null property references a null or transient value : com.spring.mvc.entity.Question.survey
При создании объекта не получается привязать к нему внешний ключ и добавить в дб.
Контроллер
@Controller
public class QuestController {
@Autowired
private SurveyService surveyService;
@Autowired
private QuestService questService;
@RequestMapping("addQuest")
public String addNewQuestion(@RequestParam("survey_id") int survey_id, Model model){
Question question = new Question();
question.setSurvey(surveyService.getSurvey(survey_id));
model.addAttribute("question", question);
return "quest-info";
}
@RequestMapping("saveQuest")
public String saveQuest(@ModelAttribute("question") Question question){
questService.saveQuestion(question);
return "redirect:showAllSurveys";
}
Service и DAO
@Repository
public class QuestionDAOImp implements QuestionDAO {
@Autowired
private SessionFactory sessionFactory;
@Override
public void saveQuestion(Question question) {
Session session = sessionFactory.getCurrentSession();
session.saveOrUpdate(question);
}
}
@Service
public class QuestServiceImp implements QuestService{
@Autowired
private QuestionDAO questionDAO;
@Override
@Transactional
public void saveQuestion( Question question) {
questionDAO.saveQuestion(question);
}
}
Entity
@Entity
@Table(name = "questions")
public class Question {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "text")
private String text;
@Column(name = "type")
private String type;
@ElementCollection
private Map<String,String> types;
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.DETACH,
CascadeType.MERGE,CascadeType.REFRESH})
@JoinColumn(name="survey_id", nullable=false)
private Survey survey;
public Question() {
types=new HashMap<>();
types.put("write","write");
types.put("chose1","chose1");
types.put("choseMany","choseMany");
}
public Question(String text, String type) {
this.text = text;
this.type = type;
}
//geters and setters
}
@Entity
@Table(name = "surveys")
public class Survey {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "start_date")
private Date startData;
@Column(name = "finish_date")
private Date finishData;
@Column(name = "description")
private String description;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "survey",fetch = FetchType.EAGER)
private List<Question> questions;
public Survey() {
}
public Survey(String name, Date startData, Date finishData, String description) {
this.name = name;
this.startData = startData;
this.finishData = finishData;
this.description = description;
}
//getters and setters
}
jsp
all-Surveys.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<title>List of surveys</title>
</head>
<body>
<c:url var ="addSurvButton" value="/addNewSurvey">/>
</c:url>
<table>
<tr> <th>Name</th>
<th>Start date</th>
<th>Finish date</th>
<th>Description</th>
<th>Operations</th>
</tr>
<c:forEach var="surv" items="${allSurv}">
<c:url var ="questsButton" value="/showDetQuests">
<c:param name="survey_id" value="${surv.id}"/>
</c:url>
<c:url var ="questsAddButton" value="/addQuest">
<c:param name="survey_id" value="${surv.id}"/>
</c:url>
<c:url var ="updateButton" value="/updateSurvey">
<c:param name="survey_id" value="${surv.id}"/>
</c:url>
<c:url var ="deleteButton" value="/deleteSurvey">
<c:param name="survey_id" value="${surv.id}"/>
</c:url>
<tr>
<td>${surv.name}</td>
<td>${surv.startData}</td>
<td>${surv.finishData}</td>
<td>${surv.description}</td>
<td> <input type="button" value="Pick"
onclick="window.location.href = '${questsButton}' "/>
<input type="button" value="Update"
onclick="window.location.href = '${updateButton}' "/>
<input type="button" value="Delete"
onclick="window.location.href = '${deleteButton}' "/>
<input type="button" value="addQuest"
onclick="window.location.href = '${questsAddButton}' "/>
</tr>
</c:forEach>
quest-info.jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>`
<!DOCTYPE html>
<html>
<body>
<h2> Quest info</h2>
<br>
<form:form action="saveQuest" modelAttribute="question" >
<form:hidden path="id"/>
Text <form:input path="text"/>
<br><br>
Type <form:select path="type" items="${question.types}"/>
<br><br>
<input type="submit" value="OK">
</form:form>
</body>
</html>
Собственно когда перехожу в quest-info.jsp что бы заполнить данные и пытаюсь сохранить выпадает ошибка
Request processing failed; nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.spring.mvc.entity.Question.survey
как я понимаю она возникает потому что пытаюсь добавить в дб Question без внешнего ключа привязанному к survey, но в контролере в методе addNewQuestion устанавливаю значение survey еще до того как он попадет в форму quest-info.jsp, причем это значение является полноценным по содержанию и не null.
ps помогите плиз я совсем начинающий и трахаюсь уже 3 дня, и пытался различными способами и через вызов Survey и добавление в лист выдает ту же ошибку бтв и другими способами, но тщетно