2014-12-11 71 views
0

我對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); 
+0

嘗試@ManyToMany(級聯= CascadeType.ALL,取= FetchType.EAGER),這將做加盟的全外連接,則默認爲一個內部連接,或許數據沒有進入student_skills表,因爲連接是空的 – 2014-12-11 02:40:31

+0

似乎沒有工作。請參閱我的EIDT,我設法通過創建一個StudentActivities對象將其保存到映射表中,但是與此相關的問題是它重寫了StudentActivities表中的條目,除非我在活動名稱中使用硬編碼 – joe 2014-12-11 02:48:58

回答

-1

您可以使用類似:

@ManyToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(name="Student_student_skills", 
       joinColumns={@JoinColumn(name="Student_ID")}, 
       inverseJoinColumns={@JoinColumn(name="Student_Skill_ID")}) 
private Set<StudentActivities> studentActivities = new HashSet<StudentActivities>(); 
+0

仍然只能插入學生表如果我這樣做 – joe 2014-12-11 10:01:36

+0

檢查這一個:http://stackoverflow.com/a/12553056/1643465 – 2014-12-11 13:43:09