我對hibernate相當陌生,我試圖將數據保存到Student表中並加入包含學生和相關學生技能表的複合鍵的表。我使用Spring MVC和一個農場來填充這些數據。我覺得我錯誤地在窗體或冬眠中映射,但是我不確定哪裏出錯了。休眠沒有保存到ManyToMany中的映射表
形式:
<form action="/SpringMVCProject/submitAdmissionForm" method="POST">
First name: <input type="text" name="studentFname" />
<br>
Last name: <input type="text" name="studentLname" />
<br>
Date of birth: <input type="text" name="studentDOB" />
<br>
Mobile num: <input type="text" name="studentMobile" />
<br>
Select skills: <select name="studentActivities.skill_id">
<option value="1">Java</option>
<option value="2">C++</option>
<option value="3">C#</option>
<option value="4">.NET</option>
<option value="5">Python</option>
<option value="6">Ruby</option>
</select>
<br>
Country: <input type="text" name="studentAddress.country" />
<br>
City: <input type="text" name="studentAddress.city" />
<br>
Street: <input type="text" name="studentAddress.street" />
<br>
Postal code: <input type="text" name="studentAddress.pincode" />
<br>
<input type="submit" value="Submit" />
</form>
Student類:
@Entity
public class Student {
@Id
@GeneratedValue
private int studentID;
private String studentFname;
@Size(min=5, max=8)
@Pattern(regexp="[a-z]*")
private String studentLname;
@Embedded
private Address studentAddress;
@Past
private Date studentDOB;
private Long studentMobile;
@ManyToMany(cascade = CascadeType.ALL)
private Set<StudentActivities> studentActivities = new HashSet<StudentActivities>();
}
StudentActivities類:
@Entity
@Table(name="student_skills")
public class StudentActivities {
@Id
@GeneratedValue
private int skill_id;
private String skill_name;
}
這裏是我如何保存它在一個控制器類:
@RequestMapping(value = "/submitAdmissionForm", method = RequestMethod.POST)
public ModelAndView submitAdmissionForm(@Valid @ModelAttribute("student1") Student student1, BindingResult result)
{
ModelAndView model;
if(result.hasErrors())
model = new ModelAndView("AdmissionForm");
else
{
SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
session.beginTransaction();
session.save(student1);
session.getTransaction().commit();
session.close();
sessionFactory.close();
model = new ModelAndView("AdmissionSuccess");
}
return model;
}
所以它當前將所有數據保存到學生表中,但不保存到我的'Student_student_skills'表中。 'student_skills'表中已經有數據,所以我不完全確定是否值得擁有StudentActivities類,因爲我實際上並不想將數據輸入到'student_skills'表中?然而,主要擔心的是數據實際上並未保存到映射表中。我在哪裏錯了?
編輯:
我能夠得到它通過創建一個StudentActivities對象,並在學生類創建一個單獨的領域來拯救持有技能ID,我只是使用了設置技能ID在學生活動,不知道這是否是正確的方法。看起來大部分教程都是硬編碼數據庫條目,讓hibernate完成這些工作,但在我的情況下,我已經有了數據條目,並希望從表單中的列表中選擇它們。唯一的問題是,skill_name值留空,因爲我沒有指定一個skill_name,我必須硬編碼它們,有沒有辦法阻止它更新我的student_skills表?
StudentActivities student_skills = new StudentActivities();
student_skills.setSkill_id(student1.getSkillID());
student1.getStudentActivities().add(student_skills);
嘗試@ManyToMany(級聯= CascadeType.ALL,取= FetchType.EAGER),這將做加盟的全外連接,則默認爲一個內部連接,或許數據沒有進入student_skills表,因爲連接是空的 – 2014-12-11 02:40:31
似乎沒有工作。請參閱我的EIDT,我設法通過創建一個StudentActivities對象將其保存到映射表中,但是與此相關的問題是它重寫了StudentActivities表中的條目,除非我在活動名稱中使用硬編碼 – joe 2014-12-11 02:48:58