1

Here is my user_answer entity:

package com.example.demo.entities;

import org.junit.ClassRule;

import javax.persistence.*;
import javax.persistence.criteria.CriteriaBuilder;

@Entity
@Table(name = "user_answer")
public class UserAnswer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long device_id;
    private Integer quiz_id;
    private String questionNum;
    private String answerNum;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
// 0, 1, 2, 3, 4 corresponding to A, B, C, D, E


    public Long getDevice_id() {
        return device_id;
    }

    public void setDevice_id(Long device_id) {
        this.device_id = device_id;
    }

    public long getQuiz_id() {
        return quiz_id;
    }

    public void setQuiz_id(Integer quiz_id) {
        this.quiz_id = quiz_id;
    }

    public String getQuestionNum() {
        return questionNum;
    }

    public void setQuestionNum(String questionNum) {
        this.questionNum = questionNum;
    }

    public String getAnswerNum() {
        return answerNum;
    }

    public void setAnswerNum(String answerNum) {
        this.answerNum = answerNum;
    }
}

Here is where I did saving:

@RequestMapping("/test")
    public String viewTest(@ModelAttribute UserAnswer answer, @AuthenticationPrincipal CustomUserDetails userDetails,
                           HttpSession session, @RequestParam(name = "q", required = false, defaultValue = "0") String qNum,
                           @RequestParam(name = "id", required = false, defaultValue = "1") String quizID, Model model,
                           HttpServletRequest req) {
        int index = Integer.parseInt(qNum) + 1;

        JSONObject question = (JSONObject) HttpController.GetQuestion(quizID, qNum);
        if (question != null) {
            model.addAttribute("problem", question.get("problem"));
            model.addAttribute("answer0", question.get("answer0"));
            model.addAttribute("answer1", question.get("answer1"));
            model.addAttribute("answer2", question.get("answer2"));
            model.addAttribute("answer3", question.get("answer3"));
            model.addAttribute("url", "/test?id=" + quizID + "&q=" + (index));
            model.addAttribute("qNum", "" + index);
            UserAnswer userAnswer = (UserAnswer) session.getAttribute("user_answer");
            if (userAnswer != null) {
                String previousQuesiton = userAnswer.getQuestionNum();
                System.out.println("Previous question: " + previousQuesiton);
                String previousAnswer = userAnswer.getAnswerNum();
                if (previousAnswer == null) {
                    previousAnswer = "";
                }
                System.out.println("Previous answer: " + previousAnswer);
                String newQuestion = qNum;
                String newAnswer = answer.getAnswerNum();
                newQuestion = previousQuesiton + newQuestion;
                System.out.println("New question: " + newQuestion);
                newAnswer = previousAnswer + newAnswer;
                System.out.println("New answer: " + newAnswer);
                answer.setAnswerNum(newAnswer);
                answer.setQuiz_id(Integer.parseInt(quizID));
                answer.setQuestionNum(newQuestion);
                req.getSession().setAttribute("user_answer",answer);
                return "test.html";
            } else
                answer.setQuestionNum(qNum);
                req.getSession().setAttribute("user_answer",answer);
                return "test.html";
        } else {

//            Cookie[] cookies = req.getCookies();
//            UserAnswer userAnswer = (UserAnswer) req.getSession().getAttribute("user_answer");
//            String previousAnswer = userAnswer.getAnswerNum();
//            String newAnswer = previousAnswer + answer.getAnswerNum();
//            userAnswer.setAnswerNum(newAnswer);
            if (userDetails != null) {
                UserAnswer userAnswer = (UserAnswer) req.getSession().getAttribute("user_answer");
                String previousAnswer = userAnswer.getAnswerNum();
                String newAnswer = previousAnswer + answer.getAnswerNum();
                userAnswer.setAnswerNum(newAnswer);
                System.out.println("user login");
                userAnswer.setDevice_id(userDetails.getDeviceID());
                userAnswerRepository.save(userAnswer);
            } else{
                UserAnswer not_login_userAnswer = (UserAnswer) req.getSession().getAttribute("user_answer");
                String previousAnswer = not_login_userAnswer.getAnswerNum();
                String newAnswer = previousAnswer + answer.getAnswerNum();
                not_login_userAnswer.setAnswerNum(newAnswer);
                Long deviceID = getCookie(req);
                not_login_userAnswer.setDevice_id(deviceID);
                userAnswerRepository.save(not_login_userAnswer);
            }


            req.getSession().removeAttribute("user_answer");
            System.out.println("Question not found");
            // go to results page
            return "ThankForTakingTest.html";
        }

    }

Here is my propertie file:

spring.jpa.hibernate.ddl-auto= update

The implementation that I want is:

  1. When I finish the quiz, I want to save all the answers and questions number inside user_answer database with a device id for guest user. Moreover, inside user_answer table it also have their own id too, the reason why I did this, because I want to make sure that when new user come to do my quiz they will have their new device_id and when they finish with all their question, all their answers will save in user_answer.
Ly Bunvath
  • 21
  • 4
  • Hibernate uses id field to decide save or update. Can you unset the id field and try again – aksappy Mar 24 '21 at 16:01
  • Does this answer your question? [How do I update an entity using spring-data-jpa?](https://stackoverflow.com/questions/11881479/how-do-i-update-an-entity-using-spring-data-jpa) – Anish B. Mar 24 '21 at 16:04
  • The thing I want save my user_answer, but when I try to save, it's always overwrite my previous data.For example, one user finish the quiz all of their answer will save in one row with their device_id and id of the user_answer and when another user come to do another quiz I want save on the new row. Moreover, when the previous user did the same quiz again, I want to overwrite the previous answer of the question. – Ly Bunvath Mar 24 '21 at 16:08
  • What is meant by the comment '// 0, 1, 2, 3, 4 corresponding to A, B, C, D, E'? – crizzis Mar 26 '21 at 12:32
  • It just a map function that I want to map answer from 0,1,2,3,4 to A,B,C,D,E – Ly Bunvath Mar 29 '21 at 06:54

0 Answers0