2015-05-27 3 views
0

Я новичок в Spring MVC и JPA, спящий режим. Я застрял в этой ошибке. Я хочу, чтобы ваши друзья помогли в моем проекте, мы используем весенний MVC, hibernate, JPA, thymeleaf. Я реализую спрашивающий форме это мой сценарий базы данных:hibernate Ошибка сопоставления с идентификатором

CREATE TABLE IF NOT EXISTS `assessments`( 
`assessment_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`assessment_name` varchar(255) DEFAULT NULL, 
`start_date` datetime DEFAULT NULL, 
`end_date` datetime DEFAULT NULL, 
PRIMARY KEY (`assessment_id`) 
); 
CREATE TABLE IF NOT EXISTS `questions`( 
`question_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`question` varchar(255) DEFAULT NULL, 
`assessment_id` bigint(20) DEFAULT NULL, 
PRIMARY KEY (`question_id`), 
KEY `fk_key1` (`assessment_id`), 
CONSTRAINT `fk_key1` FOREIGN KEY (`assessment_id`) REFERENCES`assessments`(`assessment_id`) ON DELETE NO ACTION ON UPDATE NO ACTION); 

CREATE TABLE IF NOT EXISTS `answers` ( 
`answer_id` bigint(20) NOT NULL AUTO_INCREMENT, 
`answer` varchar(255) DEFAULT NULL, 
`question_id` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`answer_id`), 
    KEY `fk_key2` (`question_id`), 
CONSTRAINT `fk_key2` FOREIGN KEY (`question_id`) REFERENCES `questions` (`question_id`) ON DELETE NO ACTION ON UPDATE NO ACTION); 

и моя модель слой класса

public class Assessments { 
@Id 
@SequenceGenerator(name = "assessmentGen", sequenceName = "assessment_generator") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "assessmentGen") 
private long assessmentId; 

@Column  
private String assessmentName; 

@Column  
private Date startDate; 

@Column 
private Date endDate; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "assessmentId", fetch = FetchType.EAGER) 
private List<Questions> questions = new ArrayList<Questions>();} 

public class Questions { 
@Id 
@SequenceGenerator(name = "questionGen", sequenceName = "question_generator") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "questionGen") 
private long questionId; 

@Column  
private String question; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "questionId", fetch = FetchType.EAGER)  
private List<Answers> answers = new ArrayList<Answers>(); 

@ManyToOne(optional = false)  
private Assessments assessmentId; 

} 

public class Answers { 
@Id 
@SequenceGenerator(name = "answersGen", sequenceName = "answers_generator") 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "answersGen") 
private long answerId; 

@Column(name = "answer") 
private String answer; 

@ManyToOne(cascade = CascadeType.ALL) 
private Questions questionId; 
} 

и моя страница в thymeleaf

<form name="assessmentform" id="assessmentform" method="post" 
       th:action="@{/saveassessment}" th:object="${assessments}" 
       enctype="multipart/form-data"> 

       <div id="sf1" class="frm"> 
        <fieldset> 
         <legend>Assessment</legend> 

         <div class="form-group"> 
          <label class="col-lg-2 control-label" for="assessment">Assessment 
           Name: </label> 
          <div class="col-lg-3"> 
           <input type="text" placeholder="Name" id="assessmentName" 
            th:field="*{assessmentName}" class="form-control" 
            autocomplete="off" /> 
          </div> 
         </div> 
         <div class="clearfix" style="height: 10px; clear: both;"></div> 
         <div class="form-group"> 
          <label class="col-lg-2 control-label" for="startDate">Start 
           Date: </label> 
          <div class="col-lg-3"> 
           <input type="text" id="startDate" th:field="*{startDate}" 
            class="form-control" autocomplete="off" /> 
          </div> 
         </div> 
         <div class="clearfix" style="height: 10px; clear: both;"></div> 
         <div class="form-group"> 
          <label class="col-lg-2 control-label" for="endDate">End 
           Date: </label> 
          <div class="col-lg-3"> 
           <input type="text" id="endDate" th:field="*{endDate}" 
            class="form-control" autocomplete="off" /> 
          </div> 
         </div> 
         <div class="clearfix" style="height: 10px; clear: both;"></div> 
         <div class="clearfix" style="height: 10px; clear: both;"></div> 
         <div class="form-group"> 
          <div class="col-lg-10 col-lg-offset-2"> 
           <button class="btn btn-primary " type="button" id="addquestion" 
            name="addquestion">Add New Question</button> 
           <button class="btn btn-warning " type="button" id="remove" 
            name="remove">Remove Question</button> 
          </div> 
         </div> 

         <div id="templateWrapper"> 
          <div class="questiontemplate"> 
           <div class="clearfix" style="height: 10px; clear: both;"></div> 
           <label class="col-lg-2 control-label" for="question">Question 
            1: </label> 
           <textarea id="question" th:field="*{questions[0].question}" 
            cols="47" rows="3"></textarea><div class="clearfix" style="height: 10px; clear: both;"></div> 
           <label class="col-lg-2 control-label" for="question">Option 
            1: </label> 
           <input type="text" placeholder="option 1" id="option1" th:field="*{questions[0].answers[0].answer}" 
            autocomplete="off" size="50" /><div class="clearfix" style="height: 10px; clear: both;"></div> 
           <label class="col-lg-2 control-label" for="question">Option 
            2: </label>  
           <input type="text" placeholder="option 2" id="option2" th:field="*{questions[0].answers[1].answer}" 
            autocomplete="off" size="50" /><div class="clearfix" style="height: 10px; clear: both;"></div> 
           <label class="col-lg-2 control-label" for="question">Option 
            3: </label> 
           <input type="text" placeholder="option 3" id="option3" th:field="*{questions[0].answers[2].answer}" 
            autocomplete="off" size="50" /><div class="clearfix" style="height: 10px; clear: both;"></div> 
           <label class="col-lg-2 control-label" for="question">Option 
            4: </label> 
           <input type="text" placeholder="option 4" id="option4" th:field="*{questions[0].answers[3].answer}" 
            autocomplete="off" size="50" /><div class="clearfix" style="height: 10px; clear: both;"></div> 
           <div class="clearfix" style="height: 10px; clear: both;"></div> 
          </div> 
         </div> 
         <div class="clearfix" style="height: 10px; clear: both;"></div> 
         <div class="form-group"> 
          <div class="col-lg-10 col-lg-offset-2"> 
           <button class="btn btn-primary open2" type="submit">Submit 
           </button> 
          </div> 
         </div> 
        </fieldset> 
       </div> 
      </form> 

и этот мой контроллер

@RequestMapping(value = "/saveassessment", method = RequestMethod.POST) 
public String saveassessmentForm(@ModelAttribute("Assessment") Assessments assessments, BindingResult assresult) { 
    try { 
     assessmentsService.saveAssessments(assessments); 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 
    return "public_index"; 
} 

Когда я пытаюсь сохранить данные в базе данных это сохранение данных, но это не показывает отношение я имею в виду assessmentId столбец в таблице вопросов показывает значение null вместо оценочной таблицы оценки, а тот же, что и столбец questionId таблицы ответов, равен нулю. Я думаю, что мне не хватает чего-то, что я могу найти. Надеюсь, что я с моей ошибкой

+0

Какие сообщения об ошибках вы получаете? В противном случае это очень много кода для людей, чтобы обойтись без каких-либо указаний – Bendy

+0

Я не получаю никакой ошибки, это сохранение в базу данных, единственное, что я не могу сохранить вопросы с идентификатором оценки – kiran

ответ

0

Вы не опубликовали весь соответствующий код, поэтому я угадаю.

В двунаправленных ассоциациях, как и между Оценкой и Вопросами, а также между Вопросами и ответами, вы должны установить обе стороны ассоциаций. Я имею в виду, если ассоциация двунаправленная, вам нужно создать ссылку с указателями с двух сторон, а не только одну.

Таким образом, в своем классе Assessments вы можете иметь удобный метод, чтобы помочь вам сделать это:

public class Assessments { 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "assessmentId", fetch = FetchType.EAGER) 
    private List<Questions> questions = new ArrayList<Questions>();} 
    ... 

    public void addQuestion(Questions question) { 
     question.setAssessmentId(this); 
     questions.add(question); 
    } 

} 

Чем, на ваш DAO, вы должны сохранить() оба объекта:

Assessments assessments = new Assessments(); 
Questions question = new Question(); 

assessments.addQuestion(question); // Set both sides of the association 

... 

session.save(assessments); 
session.save(question); 

Вы должны вызвать save() дважды, потому что оба класса являются объектами, а их экземпляры имеют полностью независимый жизненный цикл. Новые объекты являются временными и должны быть постоянными, если вы хотите сохранить их в базе данных. Их отношения не влияют на их жизненный цикл, если они являются сущностями.

+0

Первая часть вашего ответа правильная, однако не будет указывать, каскадный вариант будет лучшим решением, чем сохранение оценок и вопрос самостоятельно. –

+0

может помочь мне узнать, как получить оценку идентификатора этой оценки, какая база данных является геномной. как привести его к контроллеру – kiran

+0

@AlanHay, вы правы. Если указать параметр каскада, лучше избегать вызова save() дважды. Спасибо, что указали это. – Baldo

Смежные вопросы