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 и добавление в лист выдает ту же ошибку бтв и другими способами, но тщетно


Ответы (0 шт):