2014-09-10 141 views
0

我正在學習Spring和Hibernate。我有以下形式休眠加入兩張表

enter image description here

在我的數據庫表中插入表單值後,我希望他們看起來像以下:

表名:學生

student_id studentName 
    1.   Jason Stathum 

表名:studentdetails

studentDetailsid FatherName MotherName student_id 
    1     Mr.X   Mrs. Y  1 

但是當我真正在我的數據庫插入值,該studentdetails表看起來像下面

表名:studentdetails

studentDetailsid FatherName MotherName student_id 
    1     Mr.X   Mrs. Y  NULL 

正如你所看到的一切完美的作品,但只有student_id列沒有按不會被填滿。你能告訴我我做錯了什麼嗎?

這裏的是我的代碼:

模型類:學生

package com.spring.org.model 

@Entity 
@Table(name = "student") 
public class Student { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="student_id", nullable= false) 
private Integer studentId; 
private String studentName; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "student") 
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>(); 

// Getters and Setters 

模型類:StudentDetails

@Entity 
@Table(name = "studentDetails") 
public class StudentDetails { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer studentDetailsId; 
private String FatherName; 
private String MotherName; 

@ManyToOne 
@JoinColumn(name="student_id") 
private Student student; 

// Getters and Setters 

控制器

@RequestMapping(value="addstudent", method = RequestMethod.GET) 
public String addStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map) 
{ 
    map.addAttribute("student", new Student());  
    return "addStudent"; 
} 

@RequestMapping(value="addstudent", method = RequestMethod.POST) 
public String saveStudent(@ModelAttribute("secret") Student student, BindingResult result, Model map) 
{ 
    studentService.addStudent(student); 
    map.addAttribute("success", "Submitted"); 
    return "msg"; 

} 

JSP頁:表

<c:url var="saveUrl" value="/addstudent" /> 
<form:form modelAttribute="secret" method="POST" action="${saveUrl}"> 
    <table> 
    <tr> 
    <td><form:label path="studentName">Student Name:</form:label></td> 
    <td><form:input path="studentName"/></td> 
</tr> 

<tr> 
    <td><form:label path="studentDetails[0].FatherName">Father Name:</form:label></td> 
    <td><form:input path="studentDetails[0].FatherName"/></td> 
</tr> 

<tr> 
    <td><form:label path="studentDetails[0].MotherName">Mother Name:</form:label></td> 
    <td><form:input path="studentDetails[0].MotherName"/></td> 
</tr> 
</table> 

<input type="submit" value="Save" /> 
</form:form> 

StudentDaoImpl

@Override 
public void addStudent(Student student) { 

    Session session = getSessionFactory().openSession(); 
    Transaction tx; 
    tx = session.beginTransaction(); 
    session.save(student); 

    tx.commit(); 
} 

回答

0

刪除從StudentDetailsstudent屬性@JoinColumn註釋應該可以解決這個問題:

@ManyToOne 
//@JoinColumn(name="student_id") 
private Student student; 
+0

感謝您的答覆。我剛剛刪除了'@JoinColumn(name =「student_id」)'並運行了我的應用程序,但仍然無法運行。它將我的列名從'student_id'改爲'student_student_id'。謝謝 – 2014-09-10 14:51:07

+0

這很奇怪,'student_id'應該是默認的列名。這裏使用JoinColumn並沒有錯,它應該是多餘的。由於StudentDetails確實被存儲,級聯似乎正在工作 - 甚至是陌生人。 – kostja 2014-09-10 14:53:44

+0

如果您(保留冗餘)保存或合併學生詳細信息保存學生後外鍵是否正確存儲? – kostja 2014-09-10 14:59:32

0

更改此片段:

@ManyToOne 
@JoinColumn(name="student_id") 
private Student student; 

到:

@ManyToOne 
private Student student; 

,這應該工作。

+0

我的(早先)答案有什麼不同? – kostja 2014-09-10 14:47:48

+0

我仍然收到NULL – 2014-09-10 14:51:54

+0

@kostja只是在編輯答案時競爭條件。無論如何,這似乎並不奏效。 – 2014-09-10 14:55:34

0

我設法解決了這個問題,我希望這有助於他人。 我在

模型類做了一些改變:學生

@Entity 
@Table(name = "student") 
public class Student { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="student_id", nullable= false) 
private Integer studentId; 
private String studentName; 

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name="student_id", referencedColumnName="student_id") 
private List<StudentDetails> studentDetails = new ArrayList<StudentDetails>(); 

// Getters and Setters 

,然後取出從模型類的private Student student;屬性:StudentDetails。所以,現在它看起來像這樣:

模型類:StudentDetails

@Entity 
@Table(name = "studentDetails") 
public class StudentDetails { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Integer studentDetailsId; 
private String FatherName; 
private String MotherName; 

// Getters and Setters